При работе с крупными базами данных, такими как Астор: Торговая Дистрибьюция, пользователи часто сталкиваются с необходимостью формировать отчеты по специфическим спискам товаров. Вводить десятки или сотни позиций номенклатуры вручную каждый раз крайне неудобно. Заказчики часто просят реализовать механизм, аналогичный «копированию-вставке» или сохранению заранее подготовленных списков. Рассмотрим, как это можно реализовать в среде 1С на обычных формах (ОФ).
Самый простой путь, не требующий написания сложного кода, — это использование встроенной возможности платформы 1С по сохранению значений реквизитов формы. Этот механизм позволяет системе «запоминать», что пользователь ввел в определенные поля, и восстанавливать эти данные при следующем открытии.
Разберем по шагам, как настроить это в конфигураторе:
СохранятьЗначения.СохраняемыеЗначения нажмем на кнопку выбора (три точки) и отметим галочкой тот реквизит, в котором хранится список номенклатуры (обычно это СписокЗначений).Проанализируем ситуацию: теперь при закрытии отчета 1С предложит сохранить настройки, а при открытии — восстановить их. Однако у этого метода есть существенный нюанс для внешних отчетов. Если пользователь просто открывает отчет через меню «Файл — Открыть», система привязывает настройки к полному пути файла на диске. Если переместить файл или переименовать его, настройки «потеряются», так как 1С не сможет сопоставить новый путь со старой записью в хранилище настроек.
Если заказчик хочет иметь возможность передавать эти списки коллегам или хранить несколько разных вариантов (например, «Список для акции», «Список дефицита»), лучше реализовать программное сохранение данных в отдельный файл. Рассмотрим пример кода для сохранения и загрузки СписокЗначений.
Создадим на форме две кнопки: «Сохранить список» и «Загрузить список». Напишем соответствующие обработчики:
// Процедура для сохранения списка номенклатуры в файл
Процедура КнопкаСохранитьНажать(Элемент)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
Диалог.Фильтр = "Списки отбора (*.lst)|*.lst";
Если Диалог.Выбрать() Тогда
Попытка
ЗначениеВФайл(Диалог.ПолноеИмяФайла, ЭлементыФормы.ПолеОтбораНоменклатуры.Значение);
Сообщить("Список успешно сохранен!");
Исключение
Предупреждение("Ошибка при сохранении файла: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецПроцедуры
// Процедура для загрузки списка из файла
Процедура КнопкаЗагрузитьНажать(Элемент)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Фильтр = "Списки отбора (*.lst)|*.lst";
Если Диалог.Выбрать() Тогда
Попытка
ЭлементыФормы.ПолеОтбораНоменклатуры.Значение = ЗначениеИзФайла(Диалог.ПолноеИмяФайла);
Сообщить("Список успешно загружен!");
Исключение
Предупреждение("Ошибка при загрузке файла!");
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Выясним причину, почему это удобно: метод ЗначениеВФайл сериализует объект 1С (в данном случае СписокЗначений) в текстовый формат, сохраняя внутренние ссылки на объекты базы данных. При загрузке через ЗначениеИзФайла система автоматически найдет ссылки на номенклатуру в текущей базе.
Заказчики часто ведут списки артикулов или кодов в Excel. Посмотрим, как реализовать быструю вставку из буфера обмена. Нам понадобится объект ТекстовыйДокумент для получения данных из буфера.
Процедура КнопкаВставитьИзБуфераНажать(Элемент)
// Используем ТекстовыйДокумент для работы с текстом
Текст = Новый ТекстовыйДокумент;
Текст.Прочитать(""); // Читает содержимое буфера обмена, если путь пуст (в некоторых случаях требует ВК)
// Альтернативно — можно использовать объект "HTMLFile" для доступа к буферу
// Предположим, пользователь скопировал колонку артикулов
Для НомерСтроки = 1 По Текст.КоличествоСтрок() Цикл
ТекущийАртикул = СокрЛП(Текст.ПолучитьСтроку(НомерСтроки));
Если ПустаяСтрока(ТекущийАртикул) Тогда Продолжить; КонецЕсли;
СсылкаНаТовар = Справочники.Номенклатура.НайтиПоАртикулу(ТекущийАртикул);
Если Не СсылкаНаТовар.Пустая() Тогда
ЭлементыФормы.ПолеОтбораНоменклатуры.Значение.Добавить(СсылкаНаТовар);
Иначе
Сообщить("Товар с артикулом " + ТекущийАртикул + " не найден!");
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Важный момент: Прямой доступ к буферу обмена в 1С без использования внешних компонент может быть ограничен. Часто разработчики просто выводят небольшое многострочное поле ввода на форму, куда пользователь вставляет текст (Ctrl+V), а затем нажимает кнопку «Обработать», которая уже разбирает этот текст по строкам и ищет ссылки в справочнике Номенклатура.
Как мы уже выяснили, работа с внешним файлом через «Файл — Открыть» неудобна для сохранения настроек. Чтобы решить проблему системно, рекомендуется зарегистрировать отчет в базе данных. В конфигурациях на базе УТ 10.3 (к которым относится и Астор) для этого используется справочник «Внешние обработки» (или «Дополнительные отчеты и обработки»).
Разберем преимущества этого подхода:
Если ваш отчет построен на базе ПостроительОтчета (что характерно для ОФ), то кнопки управления настройками появятся автоматически. Пользователь сможет создать неограниченное количество именованных настроек (например, «Поставщик А», «Сезонный ассортимент») и переключаться между ними в два клика.
Проанализируем ситуацию с типами данных. Очень важно, чтобы в СписокЗначений попадали именно ссылки на объекты (СправочникСсылка.Номенклатура), а не строки с названиями. Если вы реализуете загрузку из текстового файла или Excel, всегда используйте методы поиска:
НайтиПоКоду()НайтиПоАртикулу()НайтиПоНаименованию()Только после того, как ссылка найдена, её следует добавлять в список отбора. Это гарантирует, что запрос отчета отработает корректно и быстро, используя индексированные поля базы данных.
Подводя итог, для начинающего разработчика в 1С самым эффективным решением будет либо включение свойства СохранятьЗначения в форме, либо регистрация отчета как дополнительного, чтобы использовать типовой механизм сохранения вариантов отчета. Это сэкономит время на написание кода и обеспечит пользователю привычный интерфейс.