Жёлтая тетрадь 📒 Блог о разработке в 1С 👨‍💻
1.14K subscribers
42 photos
69 links
В основном небольшие и нерегулярные личные заметки о разработке на платформе 1С:Предприятие.

@builin - по всем вопросам, вакансии и рекламу не размещаю.

Еще один мой канал: @kodbaza (осторожно, там мясо)
Download Telegram
Программная доработка форм типовых конфигураций

В типовых конфигурациях в формах ПриСозданииНаСервере вызывается метод общего модуля СобытияФорм (см. скрин 1). Если расширить только этот модуль, то можно в одном модуле собрать все программные модификации форм (см. скрин 2).

Получается удобная универсальная оснастка, которую можно тиражировать во все свои проекты.

@yellow_pad | #совет #оснастка #Форма #листинг
Как правильно сделать условное оформление

По правилам системы стандартов и методик условное оформление рекомендуется делать программно в коде формы при создании на сервере, а не в настройках оформления элемента формы. Вот выдержка из ССиМ:

Такой подход имеет ряд преимуществ перед заданием настроек условного оформления в свойствах формы:
• настройки однотипного условного оформления можно вынести в общие модули
• при объединении конфигураций есть возможность объединять условное оформление
• при изменении в метаданных (например, переименовании значения перечисления) условное оформление может перестать работать. Если условное оформление настраивается в коде конфигурации, то при синтаксическом контроле модулей эта ошибка будет выявлена.

Пример процедуры установки условного оформления:
&НаСервере
Процедура УстановитьУсловноеОформление()

УсловноеОформление.Элементы.Очистить();

Элемент = УсловноеОформление.Элементы.Добавить();

ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыУпаковка.Имя);

ГруппаОтбора1 = Элемент.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
ГруппаОтбора1.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли;

ОтборЭлемента = ГруппаОтбора1.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("АдресноеХранение");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Ложь;

ОтборЭлемента = ГруппаОтбора1.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.ТипНоменклатуры");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно;
ОтборЭлемента.ПравоеЗначение = Перечисления.ТипыНоменклатуры.Товар;

ОтборЭлемента = ГруппаОтбора1.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Статус");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Перечисления.СтатусыПриходныхОрдеров.КПоступлению;

Элемент.Оформление.УстановитьЗначениеПараметра("ОтметкаНезаполненного", Ложь);

КонецПроцедуры

@yellow_pad | #СтандартыРазработки #ССиМ #Форма #УсловноеОформление #1с
Кеширование предопределенных значений на клиенте

При использовании функции глобального контекста ПредопределенноеЗначение нет необходимости реализовывать механизмы кеширования на клиенте, т.к. результаты этой функции автоматически кешируются платформой.

ЮрФизЛицо = ПредопределенноеЗначение("Перечисление.ЮридическоеФизическоеЛицо.ЮридическоеЛицо");

При использовании БСП вместо ПредопределенноеЗначение можно использовать ОбщегоНазначения.ПредопределенныйЭлемент или ОбщегоНазначенияКлиент.ПредопределенныйЭлемент. Это то же самое, только не падает с ошибкой, если получать несуществующее значение.

@yellow_pad | #1с #Форма #КлиентСервер #ССиМ
Обработка данных динамического списка

У динамического списка есть событие ПриПолученииДанныхНаСервере(), и через это событие можно выводить в список расчетные данные для выводимых элементов списка. Получение данных будет выполняться только для тех данных, что выводятся в список, если правильно написать метод. Например, можно получить список ответственных и вывести их строкой через запятую, или, как в примере с Зазеркалья (см. скриншот), вывести остаток товара.

Поле, в которое мы будем выводить данные, нужно заранее добавить в динамический список как пустое поле произвольного запроса.

@yellow_pad | #1С #Форма #ДинамическийСписок
Модуль изменения управляемых форм

При доработке типовых конфигураций, для уменьшения издержек на сопровождение конфигурации при ее обновлении, доработка форм должна производиться с максимальным приоритетом программной доработки.

Целью модуля является упрощенное добавление реквизитов формы, добавление их на форму (в том числе и таблиц), так же добавление групп, команд формы и кнопок к ним.

Ссылка и источник: https://github.com/huxuxuya/1cFormEditor

@yellow_pad | #Инструментарий #Форма
Проверка действительного изменения реквизита формы

Например, нужно перезаполнить табличную часть при изменении вида операции и только если его действительно поменяли, а не перевыбрали. Хорошо бы еще и пользователя предупредить о том, что данные будут перезаполнены.

Часто встречал реализацию проверки кешированием текущего значения в реквизит формы. Но в типовой нашелся такой пример.

@yellow_pad | #1С #ПриИзменении #Форма
Использование недоступных в расширении событий

Ситуация на скриншоте: не все события ТЧ доступны для использования в расширении. Сделано это было в редакции 8.3.14, чтобы сократить количество заимствованных свойств формы: см. Упрощение работы с расширениями формы в Зазеркалье.

Способ решения - добавить в модуль расширения формы метод нужного обработчика:

&НаКлиенте
Процедура ext_ТоварыПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)

...

КонецПроцедуры

А в ПриСозданииНаСервере (или в методе программной доработки формы) назначить обработчик события программно:

ЭтаФорма.Элементы.Товары.УстановитьДействие("ПриНачалеРедактирования", "ext_ТоварыПриНачалеРедактирования");

@yellow_pad | #1С #Расширения #Форма #ОбработчикиСобытий
Заполнение формы объекта без записи в БД

Пример кода, которым можно заполнить и открыть формы объектов (например, загрузить несколько документов), не записывая их. Например, чтобы пользователь мог самостоятельно проверить и дозаполнить документы. Можно заполнить любые реквизиты объекта без доработки конфигурации (даже если реквизит не заполняется из входящих данных).

&НаКлиенте
Процедура ОткрытьФормуНового(Команда)

Форма = ПолучитьФорму("Документ.ПродажаТоваровУслуг.Форма.ФормаДокумента");
ДанныеФормы = Форма.Объект;
ЗаполнитьНаСервере(ДанныеФормы);
КопироватьДанныеФормы(ДанныеФормы, Форма.Объект);
Форма.Открыть();

КонецПроцедуры

&НаСервере
Процедура ЗаполнитьНаСервере(НовыйОбъект)
НовыйОбъект.Контрагент = Справочники.Контрагенты.НайтиПоКоду("000000005");
КонецПроцедуры

Шаблон: fastcode | Кодом поделился читатель I N

@yellow_pad | #1С #ОткрытьФорму #Форма