1С бухгалтерия

Давно уже пишу про 1С и Drupal, но каждый раз это получаются отдельные статьи: либо по 1С либо по Drupal и вот, пожалуй, первая статья, которая будет посвящена двум основным темам сразу.

Поводом к написанию послужил очередной заказ, где заказчику понадобилось делать автоматический обмен данными между 1С и сайтом(на Drupal). Подчеркиваю, обмен должен быть автоматический, и производиться должен как можно чаще, чтобы остатки товаров на сайте были актуальны. Из названия статьи видно, что данная статья будет посвящена первой половине обмена данными, а именно выгрузке на сайт. Проще всего это сделать по ФТП, поэтому приступим. Да, чуть не забыл, у моего клиента база 1С - это Бухгалтерия 7.7, поэтому и разбирать выгрузку будем для 7-й версии.

Создаем внешнюю обработку "ВыгрузкаНаСайт.ert", со следующим модулем:

Перем БухИт;    
 
Функция ОстатокНаСкладе(Тов)
	Остаток = 0;
	Если (КонМесяца(РабочаяДата()) <= КонецРассчитанногоПериодаБИ()) и (Тов.Выбран() = 1) Тогда
		Если Тов.ТипНоменклатуры = Перечисление.ТипыНоменклатуры.Товар Тогда
			СчетУчета = СчетПоКоду("41.1");
		ИначеЕсли Тов.ТипНоменклатуры = Перечисление.ТипыНоменклатуры.Продукция Тогда
			СчетУчета = СчетПоКоду("43");
		Иначе
			СчетУчета = "";
		КонецЕсли;	
 
		Остаток = БухИт.СКД(СчетУчета, "К",, Тов);
	КонецЕсли;
 
	Возврат Остаток;
КонецФункции
 
Процедура Сформировать()             
	Текст = СоздатьОбъект("Текст");
	Попытка
		Текст.Открыть(КаталогИБ()+"ftp\settings.txt");
	Исключение  
		Сообщить("Не удалось открыть файл настроек");
		Возврат;
	КонецПопытки;
	Сервер = СокрЛП(Текст.ПолучитьСтроку(1));
	Логин = СокрЛП(Текст.ПолучитьСтроку(2));
	Пароль = СокрЛП(Текст.ПолучитьСтроку(3));
 
 
	БухИт = СоздатьОбъект("БухгалтерскиеИтоги");
	Текст = СоздатьОбъект("Текст");
	СпрНом = СоздатьОбъект("Справочник.Номенклатура");
	СпрЦены = СоздатьОбъект("Справочник.Цены");
	СпрТипыЦен = СоздатьОбъект("Справочник.ТипыЦен");
 
	ТЗ = СоздатьОбъект("ТаблицаЗначений");
	ТЗ.НоваяКолонка("Товар");
	ТЗ.НоваяКолонка("Уровень");
	ТЗ.НоваяКолонка("ТипЦены");
	ТЗ.НоваяКолонка("Цена");
	ТЗ.НоваяКолонка("Количество");
 
 
	Если СпрНом.ВыбратьЭлементы()=0 Тогда
		Возврат;
	КонецЕсли;  
	Пока СпрНом.ПолучитьЭлемент(1) = 1 Цикл
		Если СпрНом.ПометкаУдаления() = 1 Тогда
			Продолжить;
		КонецЕсли;     
		Если СпрНом.ХА_ВыгружатьНаСайт = 0 Тогда
			Продолжить;
		КонецЕсли;  
		Тов = СпрНом.ТекущийЭлемент();
		ПлЛист = СпрНом.ХА_Площадь;
		Если СпрНом.ЭтоГруппа() = 1 Тогда
			ТЗ.НоваяСтрока();
			ТЗ.Товар = Тов;
			ТЗ.Уровень = Тов.Уровень();
			Продолжить;
		КонецЕсли;  
 
		Остаток = ОстатокНаСкладе(Тов);
		СпрЦены.ИспользоватьВладельца(Тов);
		СпрЦены.ИспользоватьДату(РабочаяДата());
 	 	СпрЦены.ВыбратьЭлементы();
		Пока СпрЦены.ПолучитьЭлемент() = 1 Цикл 
			ТипЦены = СпрЦены.ТипЦен;
			Если ТипЦены.ХА_ВыгружатьНаСайт = 0 Тогда
				Продолжить;
			КонецЕсли;
			Цена = СпрЦены.Цена;
			ТЗ.НоваяСтрока();
			ТЗ.Товар = Тов;
			ТЗ.Уровень = Тов.Уровень();
			ТЗ.ТипЦены = СокрЛП(ТипЦены.Код);
			ТЗ.Цена = Цена;
			ТЗ.Количество = Остаток;
		КонецЦикла;
	КонецЦикла;  
 
	ТЗ.Сортировать("Уровень+");
	ТЗ.ВыбратьСтроки();
	Пока ТЗ.ПолучитьСтроку() = 1 Цикл
		Стр = СокрЛП(ТЗ.Товар.Код)+	СимволТабуляции+
			СокрЛП(ТЗ.Товар.Наименование)+СимволТабуляции+
			Строка(ТЗ.Товар.ЭтоГруппа())+СимволТабуляции+
			СокрЛП(ТЗ.Товар.Родитель.Код)+СимволТабуляции+
			СокрЛП(ТЗ.ТипЦены)+СимволТабуляции+
			Строка(ТЗ.Цена)+СимволТабуляции+
			Строка(ТЗ.Количество)+СимволТабуляции+
			Строка(ТЗ.Товар.ХА_Площадь);
		Текст.ДобавитьСтроку(Стр);
	КонецЦикла;
	ИмяФайлаПрайс = КаталогИБ()+"ftp\price.csv";
	Текст.Записать(ИмяФайлаПрайс);
 
	Если ЗаписьЛокально = 0 Тогда
		// Создаем временный файл для пакетного выполнения команды ftp
		ИмяФайлаФТП = КаталогИБ()+"ftp\transfer.ftp";
		Текст = СоздатьОбъект("Текст");
		Текст.ДобавитьСтроку("open " + Сервер);
		Текст.ДобавитьСтроку(Логин);
		Текст.ДобавитьСтроку(Пароль);
		Текст.ДобавитьСтроку("put " + ИмяФайлаПрайс + " domains/site.ru/public_html/sites/default/files/price.csv");
		Текст.ДобавитьСтроку("quit");
		Текст.Записать(ИмяФайлаФТП);   
 
		КомандаСистемы("ftp -s:" + ИмяФайлаФТП);
 
		ФС.УдалитьФайл(ИмяФайлаФТП);
		ФС.УдалитьФайл(ИмяФайлаПрайс);
	КонецЕсли;
 
 
КонецПроцедуры    
 
Процедура ПриОткрытии()
	Если ТипЗначенияСтр(Форма.Параметр) = "СписокЗначений" Тогда
		СтатусВозврата(0);
		Сформировать();
	КонецЕсли;
КонецПроцедуры

Вот собственно и вся обработка выгрузки. Теперь немного комментариев к самой обработке. Во-первых, из кода видно, что для правильной работы необходимо в каталоге с базой создать папку "ftp", в которой должен находиться текстовый файл "settings.txt". Это файл с настройками доступа к FTP-серверу. Для простоты в каждой строчке - свой параметр. Пример такого файала:

ftp.site.ru
user_name
password

Дальнейший код выгрузки у каждого будет скорее всего свой, поэтому я привел свой лишь для образца. Скорее всего, у вас будут какие-то свои специальные реквизиты, которые будут соответствовать специфике ваших товаров (как, например, реквизит ХА_Площадь в моем случае). Единственное, что хочу отметить - это то, что в типовой конфигурации в справочниках "Номенклатра" и "Типы цен" я добавил новые числовые реквизиты "ХА_ВыгружатьНаСайт", а в формах этих справочников я соответственно добавил чекбоксы, чтобы можно было отметить какие именно элементы справочников должны выгружаться на сайт.

Как видно из кода, каждая номенклатура выгружается в одной строке с
разделителем (так удобнее потом загрузку делать). Разделитель может быть любой, я выбрал Табуляцию. В конечном итоге, мы получаем файл price.csv, которые записывается в ту же папку "ftp". "ЗаписьЛокально" - это имя чекбокса на форме нашей обработки. Это может понадобиться на этапе отладки, когда вам надо будет просто создать нужный вам файл без тестирования его отправки по ФТП. Так что можно добавить этот чекбокс, будет не лишним.

Ну и на последнем этапе непосредственно сама отправка файла price.csv на ФТП сервер. Отправка идет с помощью программы ftp.exe, которая, скорее всего, лежит у вас в папке windows\system32. Параметр -s определяет выполнение команды ftp в пакетном режиме, а в файле, имя которого указывается после двоеточия, записываются те самые команды, которые мы хотим выполнить в пакетном режиме.

В 8-й версии 1С есть специальный объект для работы с протоколом FTP, который называется FTPСоединение, поэтому для 8-ки я бы делал с использованием этого объекта, но у нас в примере 7-ка, поэтому работаем с ftp.exe.

Если вы обратили внимание на процедуру ПриОткрытии(), то там обрабатываются какие-то параметры. Все так и есть. Как я уже сказал, обмен данными с сайтом должен выполняться в автоматическом режиме, поэтому создадим две константы:
ХА_ВыгружатьНаСайт - тип Перечисление.Булево
ХА_ПериодичностьВыгрузкиНаСайт - тип Число
, а в глобальный модуль конфигурации 1С добавляем следующий код:

Процедура ХА_ВыгрузитьНаСайт()
	Если ИмяПользователя() = "Системный" Тогда
		Если Константа.ХА_ВыгружатьНаСайт = Перечисление.Булево.Да Тогда
			Парам = СоздатьОбъект("СписокЗначений");
			ОткрытьФорму("Отчет",Парам,КаталогИБ()+"ftp\ВыгрузкаНаСайт.ert");
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры
 
ОбработкаОжидания("ХА_ВыгрузитьНаСайт",Константа.ХА_ПериодичностьВыгрузкиНаСайт);

Из названий констант, я думаю, ясно для чего они нужны:
ХА_ВыгружатьНаСайт - определяет будет ли производиться автоматическая выгрузка, а в константе ХА_ПериодичностьВыгрузкиНаСайт задается периодичность выгрузки в секундах. Таким образом, когда 1С будет запущена, то через заданное количество секунд будет происходить автоматическая пересылка прайса на ФТП сервер. Чтобы выгрузка не шла от каждого пользователя, который в данный момент работает с базой данных, выгрузка будет срабатывать только для пользователя с именем "Системный". Поэтому необходимо будет завести такого пользователя и запустить базу 1С от имени данного юзера.

Вот вроде и все. Да, ВыгрузкаНаСайт.ert должна лежать в той же папке ftp.

Комментарии

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Может лучше в XML выгружать? Вроде как роднее для 1C да и возможностей побольше, в том числе картинки так можно выгружать на сайт.

admin аватар

Думаю, что XML раздутый формат и для быстрого обмена данными не очень подходит. По картинкам у меня не стояло задачи, но я бы картинки скорее всего увязывал как-то по коду. Чтобы их названия соответствовали коду товара и подгружать на сайте в соответсвии с этим кодом.

Спасибо, пригодилось. Успехов.

Огромное Вам спасибо! Ваша статья очень помогла в увязке 1с с интернет-магазином. Хотелось бы посоветоваться, как лучше сделать выгрузку товаров из 1С: полностью из 1С выгружать все товары с категориями, либо в начале товары загрузить из прайс листа, а затем выгружать остатки и цены из 1с с привязкой к артикулу товара?

admin аватар

Тут все зависит от вашего конкретного случая. Если у вас товаров много, то тогда, наверное, есть смысл разбить процесс загрузки на две части. Особенно если перечень номенклатуры не часто меняется (а меняются лишь цены и количество). А если же номенклатуры не очень много и ассортимент часто меняется, то тогда смысла делать две загрузки не вижу.

Ценный пост!
Вот бы сварганить что-то подобное для УТ 8.2...10.3

admin аватар

Вполне возможно, что в скором времени у меня возникнет такая задача. И как раз с выгрузкой из УТ. Задача то даже уже сейчас стоит, вот только заниматься этим сейчас никак не могу. В начале года есть более насущные проблемы. Год дурной. Бюджетники нагружают так что вздохнуть некогда.

Согласен. + автору обработки. сейчас сам рою интернет, не что подобное для 8ки надо сделать

admin аватар

Ну если очень надо и готовы поощрить, то могу чего-нибудь предложить и для УТ. Пишите на почту если что.

)) Понимаю! Перенапрягаться, конечно, не стоит! :) Но если вдруг.. между вздохами..что-то созреет, сообщите, пожалуйста, общественности! Будет интересно. Удачного года! :)

Добрый день. Возможно ли выгрузка покупателя (номенклатура, цена, количество, ...) из 1С на сайт?

admin аватар

Не совсем понял чего вы хотите. Покупатель должен быть чем-то связан с номенклатурой (каким-то документом). Это с одной стороны. С другой стороны не понятно где у вас продажа тогда происходит - на сайте или в 1С. Если в 1С, то какой смысл эти продажи выгружать на сайт.

Смысл такой, объединить все заказы, которые оформляются в 1С и на сайте. Итог: покупатель видит все свои заказы, сумму, ... Я так понял система управлениями сайтами 1С битрикс поддерживает данную функцию. Спасибо.

admin аватар

Да, есть там обработка по обмену данными. Только в данной теме я про Drupal говорил, а у вас сайт похоже на 1С битрикс. Там свой формат обмена.

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступны HTML теги: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Строки и параграфы переносятся автоматически.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>, <1c7>, <drupal5>, <drupal6>, <javascript>, <php>. Beside the tag style "<foo>" it is also possible to use "[foo]".