При разработке внешних печатных форм в среде 1С:Предприятие часто возникают ситуации, когда стандартный код из модуля документа перестает работать или ведет себя непредсказуемо. Одной из самых коварных ошибок является попытка вызвать метод Выгрузить() у объекта, который визуально кажется таблицей, но технически ею не является. Разберем подробно, почему это происходит и как правильно управлять внешним видом печатной формы.
Проанализируем ситуацию: в коде выполняется запрос, который выбирает данные документа и его табличную часть (вложенный запрос). После выполнения запроса мы получаем объект типа ВыборкаИзРезультатаЗапроса. Посмотрим на проблемный участок кода:
Док = Запрос.Выполнить().Выбрать();
Док.Следующий();
ТаблицаИнвентаризационнаяКомиссия = Док.ИнвентаризационнаяКомиссия.Выгрузить();
Выясним причину сбоя. В языке 1С, когда вы выбираете данные через Выборка, поле, содержащее табличную часть, само становится объектом типа Выборка. У объекта ВыборкаИзРезультатаЗапроса нет метода Выгрузить(). Этот метод существует у объекта РезультатЗапроса или непосредственно у табличных частей объектов (документов, справочников).
Самый простой и надежный способ для внешних печатных форм — это выгрузка данных напрямую из объекта по его ссылке. Поскольку у нас уже есть СсылкаНаОбъект, мы можем получить актуальные данные табличной части без лишних сложностей с вложенными выборками в запросе. Рассмотрим исправленный вариант:
// Вместо обращения к результату запроса используем прямую ссылку
ТаблицаИнвентаризационнаяКомиссия = СсылкаНаОбъект.ИнвентаризационнаяКомиссия.Выгрузить();
Этот метод гарантированно вернет объект типа ТаблицаЗначений, с которым можно работать дальше: искать строки, сортировать или сворачивать данные. Важно помнить, что СсылкаНаОбъект в параметрах функции печати — это уже готовая ссылка, и дополнительно вызывать ПолучитьОбъект() не требуется, если вам нужно только прочитать данные.
Если по каким-то причинам нам необходимо получить данные именно из запроса (например, для сложной фильтрации или соединения), мы можем выгрузить весь результат запроса целиком в таблицу значений. Проанализируем, как это сделать правильно:
РезЗапроса = Запрос.Выполнить();
ТаблицаДанных = РезЗапроса.Выгрузить();
// В этом случае вложенная таблица будет доступна в колонках основной таблицы
Однако помните, что при использовании вложенных запросов структура выгруженной таблицы будет специфической. Для простых печатных форм первый вариант (через ссылку) является предпочтительным с точки зрения читаемости кода.
Рассмотрим ситуацию, когда программно заданные параметры ТабДокумент.РазмерКолонтитулаСверху = 0; или ОриентацияСтраницы.Ландшафт упорно игнорируются системой при выводе на экран или принтер. Часто разработчики сталкиваются с тем, что в окне предварительного просмотра поля все равно остаются стандартными (например, 10 мм).
Разберем по шагам, почему это происходит. Основная причина кроется в использовании свойства ИмяПараметровПечати. Посмотрим на код:
ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ПередачаОС_ДА1";
Важный момент: Как только вы задаете это свойство, 1С начинает искать сохраненные настройки печати для текущего пользователя в системном хранилище. Если пользователь ранее печатал этот документ и вручную менял поля, эти "запомненные" настройки будут иметь приоритет над вашим программным кодом.
ИмяПараметровПечати или изменить строку на уникальную (например, добавив префикс "ВНЕШНЯЯ").0, считая его командой использовать настройки по умолчанию. Попробуйте установить минимальное значение 1 (миллиметр).Показать() или Напечатать().
// Пример правильной настройки перед выводом
ТабДокумент.АвтоМасштаб = Истина;
ТабДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
ТабДокумент.ПолеСверху = 1;
ТабДокумент.ПолеСнизу = 1;
ТабДокумент.РазмерКолонтитулаСверху = 0;
// Удаляем или меняем ИмяПараметровПечати для сброса старых настроек
ТабДокумент.ИмяПараметровПечати = "УНИКАЛЬНОЕ_ИМЯ_ДЛЯ_ВНЕШНЕЙ_ФОРМЫ";
Для конфигураций Казахстана (например, Бухгалтерия 2.0) форма ДА-1 требует обязательного вывода состава инвентаризационной комиссии. Проанализируем алгоритм вывода:
1. Сначала находим председателя комиссии в таблице (используя поиск по колонке Председатель со значением Истина).
2. Затем выводим всех остальных членов комиссии.
3. Если таблица пуста, хорошим тоном считается вывод нескольких пустых строк, чтобы подписи можно было поставить вручную на бумаге.
Для корректного получения должностей и полных имен членов комиссии в типовых решениях РК рекомендуется использовать функцию ДанныеФизЛиц из модулей управления персоналом, как это реализовано в оригинальном коде. Не забывайте передавать корректную дату документа, так как должности сотрудников могут меняться со временем.
Мы проанализировали основные технические сложности при создании внешних печатных форм. Помните: работа с выборкой запроса требует внимательности к типам данных, а управление параметрами печати — понимания механизмов хранения пользовательских настроек в 1С. Используйте прямые ссылки для получения табличных частей и контролируйте ИмяПараметровПечати, чтобы ваши отчеты всегда выглядели именно так, как вы задумали.