Как реализовать работу с константами, ввод на основании и обмен данными через JSON в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе обучения и профессионального становления каждый начинающий разработчик 1С сталкивается с набором классических задач, которые проверяют знание базовых механизмов платформы. К таким задачам относятся: работа с файловой системой через диалоги, программное создание документов на основании справочников, а также использование современных форматов обмена данными, таких как JSON. Рассмотрим подробно, как решить эти задачи правильно, соблюдая стандарты разработки «1С:Предприятия 8».

1. Работа с константами и диалогом выбора файлов

Первая задача заключается в создании механизмов для хранения путей к файлам и каталогам. Для этого мы создаем две строковые константы: КаталогЗагрузки и ФайлЗагрузки. Однако просто создать их в метаданных недостаточно — пользователю нужно предоставить удобный интерфейс для их заполнения.

Проанализируем процесс реализации формы констант. Для заполнения этих данных мы будем использовать объект ДиалогВыбораФайла. Важно понимать, что в современных версиях платформы (особенно в веб-клиенте) работа с файлами должна происходить асинхронно.

Разберем по шагам создание формы констант:

  1. Создадим общую форму или форму констант.
  2. Разместим на форме поля для ввода констант и кнопки выбора (лупы).
  3. В обработчике нажатия кнопки выбора пропишем код вызова диалога.

Посмотрим на пример кода для выбора каталога:


&НаКлиенте
Асинх Процедура КаталогЗагрузкиВыбор(Элемент, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
    Диалог.Заголовок = "Выберите каталог для загрузки данных";
    
    Результат = Ждать Диалог.ВыбратьАсинх();
    
    Если Результат <> Неопределено Тогда
        Константы.КаталогЗагрузки.Установить(Результат[0]);
        Объект.КаталогЗагрузки = Результат[0];
    КонецЕсли;
КонецПроцедуры

Для выбора конкретного файла мы будем использовать режим РежимДиалогаВыбораФайла.Открытие. Также рекомендуется устанавливать фильтр, чтобы ограничить выбор пользователя только нужными расширениями, например, .json или .txt. Это предотвратит ошибки при последующей обработке данных.

2. Реализация ввода документа на основании справочника

Вторая задача — создание документа РасходнаяНакладная на основании элемента справочника Номенклатура. Этот механизм позволяет ускорить работу пользователя, автоматически перенося данные из справочника в новый документ.

Выясним причину, почему это делается именно в модуле объекта документа. Основная логика заполнения должна быть инкапсулирована внутри самого объекта, чтобы она срабатывала независимо от того, откуда вызывается создание — из формы списка справочника или программно из другой обработки. Для этого используется стандартный обработчик события ОбработкаЗаполнения.

Проанализируем пример реализации в модуле объекта документа:


Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
    
    Если ТипЗнч(ДанныеЗаполнения) = Тип("СправочникСсылка.Номенклатура") Тогда
        // На основании одной номенклатуры создаем строку в табличной части
        НоваяСтрока = Товары.Добавить();
        НоваяСтрока.Номенклатура = ДанныеЗаполнения;
        НоваяСтрока.Количество = 1; // Значение по умолчанию
        
        // Если в справочнике есть цена, можно ее подтянуть
        // НоваяСтрока.Цена = ДанныеЗаполнения.Цена;
    КонецЕсли;
    
КонецПроцедуры

Обратите внимание, что мы обязательно проверяем тип параметра ДанныеЗаполнения. Это критически важный момент, так как документ может заполняться на основании разных объектов или создаваться вручную (в этом случае параметр будет пустым), и без проверки типов код может вызвать аварийное завершение работы системы.

3. Выгрузка в JSON и реверс строк

Третья задача является наиболее технически сложной и проверяет навыки работы с коллекциями значений, запросами и строковыми функциями. Нам нужно выбрать первые 10 элементов справочника, сохранить их в JSON, а затем загрузить обратно, инвертировав наименование.

Рассмотрим подробнее этап выгрузки. Для получения данных мы будем использовать Запрос с конструкцией ВЫБРАТЬ ПЕРВЫЕ 10. Результат запроса удобнее всего выгрузить в массив структур для последующей сериализации.


// Код выгрузки
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ ПЕРВЫЕ 10
    |   Номенклатура.Наименование КАК Наименование
    |ИЗ
    |   Справочник.Номенклатура КАК Номенклатура";

Результат = Запрос.Выполнить().Выгрузить();
МассивДляЗаписи = Новый Массив;

Для Каждого Строка Из Результат Цикл
    Структура = Новый Структура("Наименование", Строка.Наименование);
    МассивДляЗаписи.Добавить(Структура);
КонецЦикла;

ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ОткрытьФайл(ПутьКФайлу);
ЗаписатьJSON(ЗаписьJSON, МассивДляЗаписи);
ЗаписьJSON.Закрыть();

Теперь разберем алгоритм загрузки с «разворотом» строки. Поскольку в языке 1С нет встроенной функции типа Reverse, нам придется написать вспомогательную функцию. Мы будем перебирать символы строки с конца в начало и собирать их в новую переменную.

Посмотрим на пример функции реверса:


Функция РазвернутьНаименование(ИсходнаяСтрока)
    Результат = "";
    Для Индекс = 1 По СтрДлина(ИсходнаяСтрока) Цикл
        Символ = Сред(ИсходнаяСтрока, СтрДлина(ИсходнаяСтрока) - Индекс + 1, 1);
        Результат = Результат + Символ;
    КонецЦикла;
    Возврат Результат;
КонецФункции

После чтения JSON с помощью ПрочитатьJSON, мы получим массив структур. В цикле по этому массиву мы будем создавать новые элементы справочника, присваивая им обработанное наименование (например, «Товар» станет «равоТ»).

4. Обработка проблемных данных при импорте (Двойной артикул)

В практике часто встречаются ситуации, когда внешние данные (например, из Excel) приходят в некорректном виде. В обсуждении упоминалась проблема «двойного артикула», который мешает автоматической загрузке. Если артикулы в ячейке разделены каким-либо символом, нам нужно программно очистить эти данные.

Проанализируем ситуацию: если мы получаем строку вида «12345/67890», а нам нужен только первый код, воспользуемся функцией СтрРазделить. Это позволит разбить строку в массив по разделителю и взять первый элемент.


// Пример очистки артикула
ИсходныйАртикул = "12345/67890";
МассивЧастей = СтрРазделить(ИсходныйАртикул, "/");
ЧистыйАртикул = СокрЛП(МассивЧастей[0]); // Получим "12345"

Использование функции СокрЛП обязательно, так как в файлах Excel часто содержатся невидимые пробелы или символы переноса строк, которые могут сделать поиск в базе 1С по артикулу безуспешным.

Подводя итог, можно сказать, что решение подобных задач требует от разработчика понимания не только синтаксиса языка, но и логики работы объектов 1С. Использование правильных методов работы с JSON, грамотная обработка событий заполнения и внимание к деталям при работе с внешними данными — это залог создания надежных и производительных систем.

← На главную