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