1C: кнопка с выпадающим меню
Казалось бы простая вещь, однако как это сделать совершенно не очевидно и рыскал довольно долго 😉
Добавляем на форму группу «Подменю»:

Накидываем туда команд, и получаем приятного вида кнопку:

Жизнь замечательных грибов
Разработки на платформе 1С
Казалось бы простая вещь, однако как это сделать совершенно не очевидно и рыскал довольно долго 😉
Добавляем на форму группу «Подменю»:

Накидываем туда команд, и получаем приятного вида кнопку:

Функция ПолучитьРодителя(СправочникСсылка)
Пока НЕ СправочникСсылка.Родитель.Пустая() Цикл
СправочникСсылка = СправочникСсылка.Родитель;
КонецЦикла;
Возврат СправочникСсылка;
КонецФункции
Давненько не трогал 7.7 вообще. Да так, что когда пришлось, понял что забыл практически всё. Итак краткая шпаргалка для тех кто вынужден был сделать временный «даунгрейд» 😉
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Обрабатывать НеПомеченныеНаУдаление;
|ПокДн = Справочник.ПоказанияСчетчиков.ПокДн;
|Владелец = Справочник.ПоказанияСчетчиков.Владелец;
|ТекущийЭлемент = Справочник.ПоказанияСчетчиков.ТекущийЭлемент;
|Код = Справочник.ПоказанияСчетчиков.Код;
|Группировка ТекущийЭлемент Упорядочить по ТекущийЭлемент.Код;
|Условие(Владелец = счтк);
|"//}}ЗАПРОС
;
// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
возврат 0;
КонецЕсли;
Пока Запрос.Группировка(1,сортировка) = 1 Цикл
Дата_Показания="";
если сортировка=-1 тогда
Дата_Показания=НормализоватьДату(Запрос.Код);
конецесли;
возврат Запрос.ПокДн;
КонецЦикла;
возврат 0;
4. Отличия в «макете» в 7.7 от 8.х: Вместо «Макет» — «Таблица», вместо «Имя» — «Секция»

5. Данные в «Тело» можно заносить например так:
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Расчеты");
Таб.ВывестиСекцию("Шапка");
МассивСальдо.ВыбратьСтроки();
Пока МассивСальдо.ПолучитьСтроку() = 1 Цикл
// Сообщить(Шаблон("[тз.НомерСтроки]. [тз.Товар] х [тз.Количество] ед."));
лс=МассивСальдо.ЛС;
начало=МассивСальдо.СальдоНачало;
начхол=МассивСальдо.ХолоднаяВода;
начот=МассивСальдо.Отопление;
начкан=МассивСальдо.Канализация;
сто=начхол+начот+начкан;
если сто=0 тогда сто=1;конецесли;
начхол_пр=100*начхол/сто;
начот_пр=100*начот/сто;
начкан_пр=100*начкан/сто;
оплачено=МассивСальдо.Оплачено;
конец=МассивСальдо.СальдоНачало+МассивСальдо.ХолоднаяВода+МассивСальдо.Отопление+МассивСальдо.Канализация-МассивСальдо.Оплачено;
распхол=окр(начхол_пр*конец/100,2);
распротоп=окр(начот_пр*конец/100,2);
раскан=окр(начкан_пр*конец/100,2);
Таб.ВывестиСекцию("Тушка");
КонецЦикла;
Таб.Опции(0,0,0,0);
Таб.ТолькоПросмотр(1);
Таб.Показать("Результат",);
6. Если реквизит периодический, то данные из него можно получить:
норматив=ЖилоеЗдание.ВидТарифаХВиКан.НормативГВ.Получить(РабочаяДата());
7. Упоротый тип boolean: Да=Истина,Нет=Ложь
Задача: перенести содержимое регистра из одной БД в другую.
Решение: одним из способов (помимо обработки ВыгрузкаЗагрузкаДанныхXML.epf) является прямая загрузка через COM подключение. Вышло примерно так:
// соединяемся с БД
V8=Новый COMОбъект("V83.COMConnector");
Попытка
База=V8.Connect("Srvr=""fserferfw""; Ref=""ewrfwe""; Usr=""werfwerfwe""; Pwd=""werfwerfwer"";")
Исключение
сообщить("Чтото пошло не так..");
КонецПопытки;
// делаем выборку из нашего регистра
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 10
| ОчередьРаботыСВотцапСрезПоследних.Телефон КАК Телефон,
| ОчередьРаботыСВотцапСрезПоследних.ЛицевойСчет КАК ЛицевойСчет,
| ОчередьРаботыСВотцапСрезПоследних.ЛицевойСчет.Код КАК ЛицевойСчетКод,
| ОчередьРаботыСВотцапСрезПоследних.Период КАК Период,
| ОчередьРаботыСВотцапСрезПоследних.Сообщение КАК Сообщение,
| ОчередьРаботыСВотцапСрезПоследних.ДатаОбработки КАК ДатаОбработки
|ИЗ
| РегистрСведений.ОчередьРаботыСВотцап.СрезПоследних КАК ОчередьРаботыСВотцапСрезПоследних
|ГДЕ
| ОчередьРаботыСВотцапСрезПоследних.Результат = &Результат";
Запрос.УстановитьПараметр("Результат", перечисления.ГринРезультатЗапроса.Успешно);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
МенеджерЗаписи =База.РегистрыСведений.ОчередьРаботыСВотцап.СоздатьМенеджерЗаписи();
МенеджерЗаписи.ЛицевойСчет = База.справочники.vscЛицевыеСчета.НайтиПоКоду(ВыборкаДетальныеЗаписи.ЛицевойСчетКод);
МенеджерЗаписи.Телефон = ВыборкаДетальныеЗаписи.Телефон;
МенеджерЗаписи.Действие = База.перечисления.ГринДействияСВотцап.ПроверкаНаличияВотцап;
МенеджерЗаписи.Результат= База.перечисления.ГринРезультатЗапроса.Успешно;
МенеджерЗаписи.ДатаОбработки=ВыборкаДетальныеЗаписи.ДатаОбработки;
МенеджерЗаписи.Период=ВыборкаДетальныеЗаписи.Период;
МенеджерЗаписи.Статус= База.перечисления.СтатусОчередиВотцап.Обработан;
МенеджерЗаписи.Записать();
КонецЦикла;
Зачастую бывает так, что в поля, в которых не была предусмотрена валидация данных, вносят данные как бог на душу положит. И в результате получается не пойми что. Данная функция пытается нормализовать номера телефонов.
Функция ПроверитьКорректностьТелефона(телефона) экспорт
телефон=телефона;
answer=Новый Структура("error,result,errortxt,code",false,"","",0);
телефон=СтрЗаменить(телефон," ","");
телефон=СтрЗаменить(телефон,"(","");
телефон=СтрЗаменить(телефон,")","");
телефон=СтрЗаменить(телефон,"-","");
телефон=СтрЗаменить(телефон,"+","");
если СтрДлина(телефон)=10 тогда телефон="7"+телефон;конецесли;
если СтрДлина(телефон)=11 тогда
если Лев(телефон, 1)="8" тогда
телефон=Сред(телефон,2);
телефон="7"+телефон;
конецесли;
конецесли;
если СтрДлина(телефон)<>11 тогда
answer.error=true;
answer.errortxt="Не верный номер телефона";
answer.code=501;
конецесли;
answer.result=телефон;
возврат answer;
конецфункции
На выходе: answer.error true/false. Если false, то в answer.result — нормализованый номер телефона