Выгрузка каталога товаров с актуальными остатками во внешний файл формата CSV — одна из самых частых задач при интеграции 1С с интернет-магазинами, маркетплейсами или внешними системами аналитики. Формат CSV (Comma-Separated Values) ценится за свою простоту, универсальность и легкость обработки на стороне веб-серверов.
В этой статье мы подробно разберем, как решить эту задачу в конфигурации 1С:Управление торговлей 11.4. Мы рассмотрим два основных сценария: быстрый экспорт данных штатными средствами без программирования и создание профессиональной обработки для автоматической выгрузки по расписанию.
Если вам требуется разовая выгрузка «здесь и сейчас» и у вас нет под рукой программиста, можно воспользоваться стандартными возможностями системы 1С и табличного редактора Microsoft Excel.
Проанализируем пошагово, как выполнить эту операцию:
Важные подводные камни ручного метода:
00000341), Excel при открытии файла автоматически преобразует их в числа (получится 341). При сохранении в CSV нули будут безвозвратно утеряны, и сайт не сможет сопоставить товары.4,6E+12). После сохранения в CSV штрихкод будет испорчен.Для регулярного обмена ручной способ не подходит. Требуется написать внешнюю обработку. На форумах часто предлагают простые решения «на коленке за 4 минуты», подобные этому:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ТоварыНаСкладахТоргОстатки.Номенклатура КАК Номенклатура,
| ТоварыНаСкладахТоргОстатки.КоличествоОстаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладахТорг.Остатки КАК ТоварыНаСкладахТоргОстатки";
Текст = Новый ТекстовыйДокумент;
// ... обход выборки и запись через Стр = "" + Номенклатура + ";" + Остаток;
Рассмотрим подробнее, почему такой код нельзя использовать в реальной работе, и как написать его правильно:
ТоварыНаСкладахТорг. Остатки хранятся в регистре накопления ТоварыНаСкладах. Если же вам нужны свободные остатки (за вычетом резервов под заказы клиентов), данные нужно получать из регистра РаспределениеЗапасов.Текст.Записать() без параметров сохраняет файл в кодировке ANSI (Windows-1251). Нам необходимо принудительно задавать UTF-8.Ниже представлен правильный, оптимизированный шаблон кода для выгрузки остатков товаров из 1С:УТ 11.4 в CSV-формат:
&НаСервере
Процедура ВыгрузитьОстаткиВCSVНаСервере(ИмяФайла)
// 1. Подготавливаем запрос для получения физических остатков товаров в разрезе складов
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТоварыНаСкладахОстатки.Номенклатура.Код КАК Код,
| ТоварыНаСкладахОстатки.Номенклатура.Артикул КАК Артикул,
| ТоварыНаСкладахОстатки.Номенклатура.Наименование КАК Наименование,
| ТоварыНаСкладахОстатки.КоличествоОстаток КАК Остаток,
| ТоварыНаСкладахОстатки.Склад.Наименование КАК СкладНаименование
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
|УПОРЯДОЧИТЬ ПО
| Наименование";
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
ВызватьИсключение "Нет данных для выгрузки!";
КонецЕсли;
// 2. Используем специализированный объект 1С для работы с CSV
// Этот объект автоматически экранирует спецсимволы и управляет кавычками
ПараметрыЗаписи = Новый ПараметрыЗаписиCSV;
ПараметрыЗаписи.РазделительПолей = ";"; // Стандарт для СНГ-систем
ПараметрыЗаписи.СтрокаНачалаНовойСтроки = Символы.ПС;
ПараметрыЗаписи.КавычкиПолей = ВариантКавычекCSV.ПриНеобходимости;
АрхивныйФайл = Новый ЗаписьCSV;
// Явно указываем кодировку UTF-8 без BOM для совместимости с Linux-серверами сайтов
АрхивныйФайл.Открыть(ИмяФайла, КодировкаТекста.UTF8, , ПараметрыЗаписи);
// Записываем строку заголовков (шапку файла)
МассивЗаголовков = Новый Массив;
МассивЗаголовков.Добавить("Код");
МассивЗаголовков.Добавить("Артикул");
МассивЗаголовков.Добавить("Наименование");
МассивЗаголовков.Добавить("Остаток");
МассивЗаголовков.Добавить("Склад");
АрхивныйФайл.ЗаписатьСтроку(МассивЗаголовков);
// 3. Выгружаем данные
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
МассивСтроки = Новый Массив;
МассивСтроки.Добавить(Строка(Выборка.Код));
МассивСтроки.Добавить(Строка(Выборка.Артикул));
МассивСтроки.Добавить(Строка(Выборка.Наименование));
// Форматируем числовое поле остатка, убирая неразрывные пробелы в разрядах
СтрокаОстатка = Формат(Выборка.Остаток, "ЧГ=0");
МассивСтроки.Добавить(СтрокаОстатка);
МассивСтроки.Добавить(Строка(Выборка.СкладНаименование));
// Записываем подготовленный массив как одну CSV-строку
АрхивныйФайл.ЗаписатьСтроку(МассивСтроки);
КонецЦикла;
АрхивныйФайл.Закрыть();
КонецПроцедуры
При реальном внедрении выгрузки в интернет-магазин вам обязательно придется столкнуться со следующими особенностями конфигурации 1С:Управление торговлей:
Номенклатура + Характеристика. В таком случае в запрос необходимо добавить поле ТоварыНаСкладахОстатки.Характеристика и выгружать её код или наименование в отдельную колонку CSV, иначе сайт получит «схлопнутые» некорректные остатки.ЦеныНоменклатуры. Чтобы получить актуальные цены, вам потребуется в запросе сделать левое соединение остатков с виртуальной таблицей СрезПоследних регистра цен по нужному виду цен (например, «Розничная»).Использование встроенного объекта ЗаписьCSV платформы 1С v8.3 гарантирует стабильность структуры файла, корректную обработку любых длинных наименований со спецсимволами и беспроблемный импорт данных на стороне принимающего сайта.