При разработке внешних обработок и алгоритмов заполнения ручных операций в конфигурации «1С:Бухгалтерия предприятия 3.0» разработчики часто сталкиваются с нестандартным поведением управляемой формы документа ОперацияБух. Типичные проблемы проявляются в том, что после добавления строк значения субконто остаются невидимыми до ручного перевыбора счета или нажатия кнопки «Записать», а при переходе между строками последняя добавленная проводка внезапно пропадает.
Разберем детально, почему платформа ведет себя подобным образом и какими способами можно реализовать корректное программное заполнение проводок и субконто.
Проанализируем архитектуру формы документа ОперацияБух. В отличие от стандартных документов, таблица проводок здесь работает напрямую с набором записей регистра бухгалтерии Хозрасчетный, а колонки субконто (СубконтоДт1–СубконтоДт3, СубконтоКт1–СубконтоКт3) являются динамическими полями составного типа. При интерактивной работе форма выполняет ряд сервисных функций:
ОграничениеТипа и включает их видимость и доступность. Если заполнять данные через клиентское свойство ТекущиеДанные, эти внутренние механизмы не срабатывают, а свойство доступности колонки по умолчанию остается в значении Ложь.Рассмотрим наиболее надежный и архитектурно правильный подход. Вместо эмуляции действий пользователя в открытой пустой форме создадим и заполним документ целиком на сервере через объектную модель, после чего откроем готовую форму для пользователя.
Посмотрим на пример реализации серверной процедуры:
&НаСервере
Функция СоздатьИЗаполнитьОперациюНаСервере(СтруктураДанных)
ДокументОбъект = Документы.ОперацияБух.СоздатьДокумент();
ДокументОбъект.Дата = ТекущаяДата();
ДокументОбъект.Организация = СтруктураДанных.Организация;
ДокументОбъект.Содержание = "Ручная корректировка проводок";
// Заполняем набор записей регистра бухгалтерии
ТаблицаДвижений = ДокументОбъект.Движения.Хозрасчетный;
СтрокаПроводки = ТаблицаДвижений.Добавить();
СтрокаПроводки.Период = ДокументОбъект.Дата;
СтрокаПроводки.Организация = ДокументОбъект.Организация;
СтрокаПроводки.СчетДт = СтруктураДанных.СчетДт;
СтрокаПроводки.СчетКт = СтруктураДанных.СчетКт;
СтрокаПроводки.Сумма = СтруктураДанных.Сумма;
// Корректно устанавливаем субконто через обращение к видам субконто счета
СтрокаПроводки.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты] = СтруктураДанных.Контрагент;
СтрокаПроводки.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады] = СтруктураДанных.Склад;
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
Возврат ДокументОбъект.Ссылка;
КонецФункции
На клиенте нам остается только открыть созданный документ:
&НаКлиенте
Процедура СоздатьОперацию(Команда)
СсылкаНаДокумент = СоздатьИЗаполнитьОперациюНаСервере(КонтекстЗаполнения);
ПараметрыОткрытия = Новый Структура("Ключ", СсылкаНаДокумент);
ОткрытьФорму("Документ.ОперацияБух.Форма.ФормаДокумента", ПараметрыОткрытия);
КонецПроцедуры
При таком подходе при открытии формы типовая конфигурация автоматически инициализирует все ограничения типов, рассчитывает видимость субконто и корректно отображает данные без каких-либо сбоев интерфейса.
Если требуется открыть новый документ без предварительной записи в базу данных, воспользуемся стандартным механизмом платформы через структуру ЗначениеЗаполнения.
Разберем по шагам, как передать параметры при вызове формы:
ПараметрыОткрытия с ключом ЗначениеЗаполнения.ОткрытьФорму().
&НаКлиенте
Процедура ОткрытьНовуюЗаполненнуюФорму()
ДанныеЗаполнения = Новый Структура;
ДанныеЗаполнения.Вставить("Организация", ВыбраннаяОрганизация);
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("ЗначениеЗаполнения", ДанныеЗаполнения);
ОткрытьФорму("Документ.ОперацияБух.Форма.ФормаДокумента", ПараметрыОткрытия, ЭтотОбъект);
КонецПроцедуры
Если задача требует непосредственного манипулирования строками в уже открытой управляемой форме через клиентский контекст, необходимо явно управлять вспомогательными свойствами строк и таблицы формы.
Рассмотрим, как решить проблему скрытых субконто и пропадания строк:
СубконтоКт1Доступность = Истина).АвтоВводНовойСтроки присваивается значение Ложь.Посмотрим на пример клиентского кода:
// Отключаем режим автоматического ввода, чтобы избежать сброса строки
Элементы.ТаблицаПроводок.АвтоВводНовойСтроки = Ложь;
// Заполняем значения и явно активируем доступность колонок субконто
СтрокаТаблицы = Элементы.ТаблицаПроводок.ТекущиеДанные;
СтрокаТаблицы.СчетКт = ДанныеЗаполнения.СчетУчета;
СтрокаТаблицы.СубконтоКт1 = ДанныеЗаполнения.Контрагент;
СтрокаТаблицы.СубконтоКт1Доступность = Истина;
СтрокаТаблицы.СубконтоКт2 = ДанныеЗаполнения.Склад;
СтрокаТаблицы.СубконтоКт2Доступность = Истина;
Важно помнить: Прямая манипуляция свойством ТекущиеДанные на клиенте является обходным путем и рекомендуется к использованию только в ситуациях, когда невозможно применить штатные серверные методы заполнения документа.