Как реализовать сохранение списков отбора номенклатуры во внешнем отчете 1С на обычных формах?

Программист 1С v8.3 (Обычные формы) Управленческий учет Торговля и дистрибуция
← На главную

При работе с крупными базами данных, такими как Астор: Торговая Дистрибьюция, пользователи часто сталкиваются с необходимостью формировать отчеты по специфическим спискам товаров. Вводить десятки или сотни позиций номенклатуры вручную каждый раз крайне неудобно. Заказчики часто просят реализовать механизм, аналогичный «копированию-вставке» или сохранению заранее подготовленных списков. Рассмотрим, как это можно реализовать в среде 1С на обычных формах (ОФ).

Способ 1. Использование стандартного механизма сохранения значений формы

Самый простой путь, не требующий написания сложного кода, — это использование встроенной возможности платформы 1С по сохранению значений реквизитов формы. Этот механизм позволяет системе «запоминать», что пользователь ввел в определенные поля, и восстанавливать эти данные при следующем открытии.

Разберем по шагам, как настроить это в конфигураторе:

  1. Откроем форму нашего внешнего отчета в конфигураторе.
  2. Перейдем в свойства самой формы (нажмем правой кнопкой на форму в дереве или в редакторе и выберем «Свойства»).
  3. Найдем раздел «Данные».
  4. Установим флажок у свойства СохранятьЗначения.
  5. В поле СохраняемыеЗначения нажмем на кнопку выбора (три точки) и отметим галочкой тот реквизит, в котором хранится список номенклатуры (обычно это СписокЗначений).

Проанализируем ситуацию: теперь при закрытии отчета 1С предложит сохранить настройки, а при открытии — восстановить их. Однако у этого метода есть существенный нюанс для внешних отчетов. Если пользователь просто открывает отчет через меню «Файл — Открыть», система привязывает настройки к полному пути файла на диске. Если переместить файл или переименовать его, настройки «потеряются», так как 1С не сможет сопоставить новый путь со старой записью в хранилище настроек.

Способ 2. Программное сохранение списка в файл (ЗначениеВФайл)

Если заказчик хочет иметь возможность передавать эти списки коллегам или хранить несколько разных вариантов (например, «Список для акции», «Список дефицита»), лучше реализовать программное сохранение данных в отдельный файл. Рассмотрим пример кода для сохранения и загрузки СписокЗначений.

Создадим на форме две кнопки: «Сохранить список» и «Загрузить список». Напишем соответствующие обработчики:


// Процедура для сохранения списка номенклатуры в файл
Процедура КнопкаСохранитьНажать(Элемент)
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
    Диалог.Фильтр = "Списки отбора (*.lst)|*.lst";
    Если Диалог.Выбрать() Тогда
        Попытка
            ЗначениеВФайл(Диалог.ПолноеИмяФайла, ЭлементыФормы.ПолеОтбораНоменклатуры.Значение);
            Сообщить("Список успешно сохранен!");
        Исключение
            Предупреждение("Ошибка при сохранении файла: " + ОписаниеОшибки());
        КонецПопытки;
    КонецЕсли;
КонецПроцедуры

// Процедура для загрузки списка из файла
Процедура КнопкаЗагрузитьНажать(Элемент)
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    Диалог.Фильтр = "Списки отбора (*.lst)|*.lst";
    Если Диалог.Выбрать() Тогда
        Попытка
            ЭлементыФормы.ПолеОтбораНоменклатуры.Значение = ЗначениеИзФайла(Диалог.ПолноеИмяФайла);
            Сообщить("Список успешно загружен!");
        Исключение
            Предупреждение("Ошибка при загрузке файла!");
        КонецПопытки;
    КонецЕсли;
КонецПроцедуры

Выясним причину, почему это удобно: метод ЗначениеВФайл сериализует объект 1С (в данном случае СписокЗначений) в текстовый формат, сохраняя внутренние ссылки на объекты базы данных. При загрузке через ЗначениеИзФайла система автоматически найдет ссылки на номенклатуру в текущей базе.

Способ 3. Реализация функционала «Ctrl+C — Ctrl+V» (Загрузка из буфера обмена)

Заказчики часто ведут списки артикулов или кодов в Excel. Посмотрим, как реализовать быструю вставку из буфера обмена. Нам понадобится объект ТекстовыйДокумент для получения данных из буфера.


Процедура КнопкаВставитьИзБуфераНажать(Элемент)
    // Используем ТекстовыйДокумент для работы с текстом
    Текст = Новый ТекстовыйДокумент;
    Текст.Прочитать(""); // Читает содержимое буфера обмена, если путь пуст (в некоторых случаях требует ВК)
    // Альтернативно — можно использовать объект "HTMLFile" для доступа к буферу
    
    // Предположим, пользователь скопировал колонку артикулов
    Для НомерСтроки = 1 По Текст.КоличествоСтрок() Цикл
        ТекущийАртикул = СокрЛП(Текст.ПолучитьСтроку(НомерСтроки));
        Если ПустаяСтрока(ТекущийАртикул) Тогда Продолжить; КонецЕсли;
        
        СсылкаНаТовар = Справочники.Номенклатура.НайтиПоАртикулу(ТекущийАртикул);
        Если Не СсылкаНаТовар.Пустая() Тогда
            ЭлементыФормы.ПолеОтбораНоменклатуры.Значение.Добавить(СсылкаНаТовар);
        Иначе
            Сообщить("Товар с артикулом " + ТекущийАртикул + " не найден!");
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Важный момент: Прямой доступ к буферу обмена в 1С без использования внешних компонент может быть ограничен. Часто разработчики просто выводят небольшое многострочное поле ввода на форму, куда пользователь вставляет текст (Ctrl+V), а затем нажимает кнопку «Обработать», которая уже разбирает этот текст по строкам и ищет ссылки в справочнике Номенклатура.

Способ 4. Использование справочника «Внешние обработки»

Как мы уже выяснили, работа с внешним файлом через «Файл — Открыть» неудобна для сохранения настроек. Чтобы решить проблему системно, рекомендуется зарегистрировать отчет в базе данных. В конфигурациях на базе УТ 10.3 (к которым относится и Астор) для этого используется справочник «Внешние обработки» (или «Дополнительные отчеты и обработки»).

Разберем преимущества этого подхода:

  1. Отчет хранится непосредственно в базе данных (в виде двоичных данных).
  2. Платформа присваивает объекту уникальный идентификатор.
  3. Все стандартные механизмы сохранения настроек (кнопки «Сохранить настройку» и «Восстановить настройку» в верхней панели) начинают работать корректно и надежно.
  4. Настройки сохраняются в разрезе пользователей прямо в информационной базе.

Если ваш отчет построен на базе ПостроительОтчета (что характерно для ОФ), то кнопки управления настройками появятся автоматически. Пользователь сможет создать неограниченное количество именованных настроек (например, «Поставщик А», «Сезонный ассортимент») и переключаться между ними в два клика.

Рекомендации по типам данных в отборах

Проанализируем ситуацию с типами данных. Очень важно, чтобы в СписокЗначений попадали именно ссылки на объекты (СправочникСсылка.Номенклатура), а не строки с названиями. Если вы реализуете загрузку из текстового файла или Excel, всегда используйте методы поиска:

Только после того, как ссылка найдена, её следует добавлять в список отбора. Это гарантирует, что запрос отчета отработает корректно и быстро, используя индексированные поля базы данных.

Подводя итог, для начинающего разработчика в 1С самым эффективным решением будет либо включение свойства СохранятьЗначения в форме, либо регистрация отчета как дополнительного, чтобы использовать типовой механизм сохранения вариантов отчета. Это сэкономит время на написание кода и обеспечит пользователю привычный интерфейс.

← На главную