Как правильно программно заполнить табличную часть и субконто в операции на управляемой форме 1С

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При разработке внешних обработок и алгоритмов заполнения ручных операций в конфигурации «1С:Бухгалтерия предприятия 3.0» разработчики часто сталкиваются с нестандартным поведением управляемой формы документа ОперацияБух. Типичные проблемы проявляются в том, что после добавления строк значения субконто остаются невидимыми до ручного перевыбора счета или нажатия кнопки «Записать», а при переходе между строками последняя добавленная проводка внезапно пропадает.

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

Выясним причины нестандартного поведения управляемой формы

Проанализируем архитектуру формы документа ОперацияБух. В отличие от стандартных документов, таблица проводок здесь работает напрямую с набором записей регистра бухгалтерии Хозрасчетный, а колонки субконто (СубконтоДт1–СубконтоДт3, СубконтоКт1–СубконтоКт3) являются динамическими полями составного типа. При интерактивной работе форма выполняет ряд сервисных функций:

  1. Динамическая типизация полей: При выборе счета форма определяет привязанные к нему виды субконто, устанавливает для колонок свойство ОграничениеТипа и включает их видимость и доступность. Если заполнять данные через клиентское свойство ТекущиеДанные, эти внутренние механизмы не срабатывают, а свойство доступности колонки по умолчанию остается в значении Ложь.
  2. Фиксация новой строки: При интерактивном добавлении строки через элементы интерфейса строка переходит в режим редактирования. Если переключить фокус на другую строку без вызова процедур завершения ввода, платформа сбрасывает незафиксированные данные, воспринимая это как отмену ввода.

Способ 1. Заполнение документа на стороне сервера с последующим открытием

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

Посмотрим на пример реализации серверной процедуры:


&НаСервере
Функция СоздатьИЗаполнитьОперациюНаСервере(СтруктураДанных)
    
    ДокументОбъект = Документы.ОперацияБух.СоздатьДокумент();
    ДокументОбъект.Дата = ТекущаяДата();
    ДокументОбъект.Организация = СтруктураДанных.Организация;
    ДокументОбъект.Содержание = "Ручная корректировка проводок";
    
    // Заполняем набор записей регистра бухгалтерии
    ТаблицаДвижений = ДокументОбъект.Движения.Хозрасчетный;
    
    СтрокаПроводки = ТаблицаДвижений.Добавить();
    СтрокаПроводки.Период = ДокументОбъект.Дата;
    СтрокаПроводки.Организация = ДокументОбъект.Организация;
    СтрокаПроводки.СчетДт = СтруктураДанных.СчетДт;
    СтрокаПроводки.СчетКт = СтруктураДанных.СчетКт;
    СтрокаПроводки.Сумма = СтруктураДанных.Сумма;
    
    // Корректно устанавливаем субконто через обращение к видам субконто счета
    СтрокаПроводки.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты] = СтруктураДанных.Контрагент;
    СтрокаПроводки.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады] = СтруктураДанных.Склад;
    
    ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
    
    Возврат ДокументОбъект.Ссылка;
    
КонецФункции

На клиенте нам остается только открыть созданный документ:


&НаКлиенте
Процедура СоздатьОперацию(Команда)
    
    СсылкаНаДокумент = СоздатьИЗаполнитьОперациюНаСервере(КонтекстЗаполнения);
    
    ПараметрыОткрытия = Новый Структура("Ключ", СсылкаНаДокумент);
    ОткрытьФорму("Документ.ОперацияБух.Форма.ФормаДокумента", ПараметрыОткрытия);
    
КонецПроцедуры

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

Способ 2. Передача данных через параметры открытия формы

Если требуется открыть новый документ без предварительной записи в базу данных, воспользуемся стандартным механизмом платформы через структуру ЗначениеЗаполнения.

Разберем по шагам, как передать параметры при вызове формы:

  1. Формируем структуру с реквизитами шапки и таблицей движений.
  2. Передаем структуру в ПараметрыОткрытия с ключом ЗначениеЗаполнения.
  3. Вызываем метод ОткрытьФорму().

&НаКлиенте
Процедура ОткрытьНовуюЗаполненнуюФорму()
    
    ДанныеЗаполнения = Новый Структура;
    ДанныеЗаполнения.Вставить("Организация", ВыбраннаяОрганизация);
    
    ПараметрыОткрытия = Новый Структура;
    ПараметрыОткрытия.Вставить("ЗначениеЗаполнения", ДанныеЗаполнения);
    
    ОткрытьФорму("Документ.ОперацияБух.Форма.ФормаДокумента", ПараметрыОткрытия, ЭтотОбъект);
    
КонецПроцедуры

Способ 3. Корректировка доступности субконто и отключение автоввода на клиенте

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

Рассмотрим, как решить проблему скрытых субконто и пропадания строк:

  1. Включение доступности субконто: Для каждого заполняемого поля субконто необходимо явно взводить флаг доступности соответствующей колонки (например, СубконтоКт1Доступность = Истина).
  2. Отключение автоматического ввода строки: Чтобы предотвратить удаление незафиксированной строки при смене фокуса, свойству таблицы формы АвтоВводНовойСтроки присваивается значение Ложь.

Посмотрим на пример клиентского кода:


// Отключаем режим автоматического ввода, чтобы избежать сброса строки
Элементы.ТаблицаПроводок.АвтоВводНовойСтроки = Ложь;

// Заполняем значения и явно активируем доступность колонок субконто
СтрокаТаблицы = Элементы.ТаблицаПроводок.ТекущиеДанные;

СтрокаТаблицы.СчетКт = ДанныеЗаполнения.СчетУчета;
СтрокаТаблицы.СубконтоКт1 = ДанныеЗаполнения.Контрагент;
СтрокаТаблицы.СубконтоКт1Доступность = Истина;

СтрокаТаблицы.СубконтоКт2 = ДанныеЗаполнения.Склад;
СтрокаТаблицы.СубконтоКт2Доступность = Истина;

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

← На главную