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