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