При разработке в среде 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда объект (например, ДоговорКонтрагента), созданный программно, ведет себя иначе, чем созданный интерактивно через интерфейс. В этой статье мы разберем конкретный кейс из практики работы с УТ 11.5: почему обращение к реквизиту формы из расширения не дает результата при программном создании объекта и какие скрытые механизмы мешают автоматической подстановке договора в заказы клиентов.
Рассмотрим ситуацию, когда в форме договора существует поле РежимНалогообложения. Программист заимствует его в расширение, но при программном создании элемента справочника не может к нему обратиться. Давайте выясним причину этого поведения.
В платформе 1С существует четкое разделение между данными объекта (которые хранятся в таблицах базы данных) и данными формы (которые существуют только в контексте открытого окна). Реквизит РежимНалогообложения в типовых конфигурациях часто является именно реквизитом формы. Если у такого реквизита установлено свойство «Сохраняемые данные», платформа сохраняет его значения не в таблицу справочника, а в системное хранилище настроек.
Проанализируем последствия: когда мы пишем код Справочники.ДоговорыКонтрагентов.СоздатьЭлемент(), мы работаем с объектом базы данных. Форма при этом не инициализируется, ее контекст не создается, а значит, и реквизиты формы физически не существуют в памяти. Попытка обратиться к ним из модуля объекта или через переменную созданного элемента закономерно приведет к ошибке или отсутствию данных.
Если нам все же необходимо работать с элементами формы в расширении, важно соблюдать правильную последовательность действий в конфигураторе. Разберем по шагам:
Часто программисты полагают, что проблема в незаполненном «налогообложении», но на практике в УТ 11.5 механизмы фильтрации договоров гораздо строже. Рассмотрим ситуацию: договор создан программно, записан, но в ЗаказКлиента он не подставляется, пока мы не зайдем в него интерактивно и не нажмем «Провести и закрыть».
Выясним причину. При интерактивном сохранении срабатывают обработчики формы (ПриЗаписиНаСервере, ПослеЗаписиНаСервере), которые могут дозаполнять скрытые реквизиты объекта, критически важные для системы. Проанализируем основные параметры, по которым УТ 11.5 фильтрует подходящие договоры:
Действует.Если программно созданный объект ведет себя «неправильно», воспользуемся проверенным методом отладки — сравнением версий через историю изменений. Рассмотрим алгоритм действий:
ДоговорыКонтрагентов (НСИ и администрирование — Общие настройки — История изменений).В рассматриваемом нами кейсе выяснилось, что при интерактивном сохранении неявно прописывается ВалютаВзаиморасчетов. Именно отсутствие валюты в программном коде мешало автоматической подстановке договора. После добавления заполнения валюты в код создания объекта проблема исчезла.
Посмотрим на пример кода, который учитывает важные параметры для корректной работы в УТ 11.5. Мы не пытаемся заполнить реквизиты формы, а фокусируемся на обязательных реквизитах объекта:
НовыйДоговор = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();
НовыйДоговор.Заполнить(Неопределено); // Инициализация стандартных значений
НовыйДоговор.Наименование = "Основной договор программный";
НовыйДоговор.Организация = СсылкаНаОрганизацию;
НовыйДоговор.Контрагент = СсылкаНаКонтрагента;
НовыйДоговор.Партнер = СсылкаНаПартнера;
// Обязательные параметры для УТ 11.5:
НовыйДоговор.Статус = Перечисления.СтатусыДоговоровКонтрагентов.Действует;
НовыйДоговор.ВалютаВзаиморасчетов = СсылкаНаВалюту; // Важно!
НовыйДоговор.ТипДоговора = Перечисления.ТипыДоговоров.СПокупателем;
// Если нужно программно эмулировать налогообложение,
// ищем, в какой реальный реквизит объекта или регистра оно записывается.
// В типовых это может зависеть от УчетнойПолитики организации.
НовыйДоговор.Записать();
Разберем основные выводы нашего исследования:
ХранилищеОбщихНастроек или связанных регистрах сведений.Заполнить(). Это позволяет платформе отработать логику модуля объекта ОбработкаЗаполнения, что минимизирует количество «пустых» важных полей.Таким образом, понимание жизненного цикла формы и структуры данных объекта позволяет избежать ошибок при программной работе с документами и справочниками в расширениях 1С.