Данная работа выполнена в 1с 8.2, т.к. именно для нее я получил заказ. Но на самом деле нет сложности сделать тоже самое для 1С 8.3. А вот для 77 не знаю, да и вряд ли кому-нибудь это нужно.

Задание:

В базах 1С каталог обычно в виде, который удобен сотрудникам предприятия. Когда-то добавили одну серию товаров и разместили так, потом привыкли, потом доработали. Потом договорились с новым поставщиком и разместили товары рядом и так далее и тому подобное. Да, внутри работать привыкли.

Для выгрузки в интернет-магазин он совершенно не годится.

Если предложить клиенту разместить так как есть или переделать каталог под интернет магазин, то можно увидеть большие испуганные глаза клиента.

Итак, у нас есть каталог в 1с, который нельзя выгружать в том виде, в котором он находится в 1С.

У нас есть в карточке номенклатуры 2 свойства, на основании которых нужно сделать выгружаемый каталог. Это "назн" - назначение товара. Может быть несколько для одной номенклатуры. Это должен быть корень каталога и свойство "Коллекция" - это название коллекции. Коллекция заполняется номенклатурой.

Разработка:

Поискав подобные задачи в интернете, нашел замечательную доработку "Настройка в 1С произвольного дерева каталога для представления на сайтах" от разработчиков битрикс. Там же можно ее скачать. Но... Радоваться можно если у вас небольшое количество товаров. Около 100, не более. Дело в том, что дерево можно делать только руками. Автоматическое создание дерева по каким-либо условиям не предусмотрено. На версию битрикс можете не смотреть, делается под любую версию от 12, я только что выгрузил на битрикс версии 17.5.10. Инструкция для установки находится там же.

Итак, вот наша обработка от битрикс:

создание каталога для битрикс

Сделал я несколько веток будущего дерева, выгрузил на сайт... И в принципе можно звонить заказчику, радовать его найденным решением. Но вот обрадуется ли он. У него 15000 товаров и каждый еще имеет несколько назначений.

Пообщавшись с заказчиком, решил все же попробовать программно заполнять дерево для выгрузки на сайт.

Создаем свою обработку. Размещаем на ней реквизит "дерево значений", "настройка обмена с сайтом", нужные кнопочки.

создание каталога для битрикс

Алгоритм работы обработки такой:

  • Выбираем обмен с сайтом и загружаем в обработку дерево каталога.
  • Запросом получаем все назначения использования товара и заполняем их. Учитываем что если уже есть такая группа назначения, то создавать не нужно. А если ее быть не должно, то удаляем.
  • Запросом получаем номенклатуру и ее свойства "назн" и "коллекция".
  • Т.к. "назн" у нас сделан строкой с разделителями вида "1;6;6", то приводим таблицу к нормальному виду, где у нас 3 колонки "назначение, коллекция, номенкларура"
  • Смотрим каких данных у нас не должно быть в структуре удаляем их. Проходим циклом по всей таблице и заполняем дерево каталога. Если элемент новый - присваиваем ему guid. Если не новый - перезаполняем в нем номенклатуру.

Полностью выгружать обработку не буду, она все равно годится только для организации заказчика. Можете заказать ее под ваши требования тут.

Приведу ключевые моменты реализации.

подключение к настройке обмена и вывод дерева на форму:

 
если ЗначениеЗаполнено(НастройкаОбменаССайтом)=ложь тогда предупреждение("нужно заполнить настройку обмена"); возврат; конецЕсли;
		Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
|	НастройкиОбменаССайтом.Ссылка,
|	НастройкиОбменаССайтом.СохраненнаяТаблицаКаталогов
|ИЗ
|	Справочник.НастройкиОбменаССайтом КАК НастройкиОбменаССайтом
|ГДЕ
|	НастройкиОбменаССайтом.Ссылка = &настройка";
Запрос.УстановитьПараметр("настройка",	НастройкаОбменаССайтом);	 //Настройки обмена с WEB - сайтом
Выборка = Запрос.Выполнить().Выбрать();

выборка.Следующий();
хранилище=выборка.СохраненнаяТаблицаКаталогов;
настройкаОбменаСсайтом=выборка.ссылка; // через нее будем менять таблицу каталогов
Знч = Хранилище.Получить();


Если Знч = Неопределено Тогда
Сообщить("Ошибка получения значения из хранилища");
КонецЕсли;



строкаТЗ=знч.получить(0);
деревоГрупп=строкаТЗ.деревоГрупп;
ДеревоКаталогаДляСайта.Колонки.Очистить();
ДеревоКаталогаДляСайта=деревоГрупп;
ЭлементыФормы.ДеревоКаталогаДляСайта.СоздатьКолонки();
ЭлементыФормы.ДеревоКаталогаДляСайта.Колонки[0].Ширина=5;
ЭлементыФормы.ДеревоКаталогаДляСайта.Колонки[1].Ширина=5;
ЭлементыФормы.ДеревоКаталогаДляСайта.Колонки[2].Ширина=5;

Сохранение дерева каталога обратно в настройке обмена:

 
если ЗначениеЗаполнено(НастройкаОбменаССайтом)=ложь тогда
		предупреждение("Невозможно сохранить структуру, так как не заполнена настройка обмена");
		возврат; 		
	конецЕсли;
		
	настр=настройкаОбменаСсайтом.получитьОбъект();
	
	таблицаЗначенийНастройкаДереваКаталогов=настр.СохраненнаяТаблицаКаталогов.получить();
	строкаТЗ=таблицаЗначенийНастройкаДереваКаталогов.получить(0);             
	строкаТЗ.деревоГрупп=ДеревоКаталогаДляСайта; // пишем наше дерево каталогов в настройку
	
	// запишем
	настр.СохраненнаяТаблицаКаталогов=Новый ХранилищеЗначения(таблицаЗначенийНастройкаДереваКаталогов);
	настр.записать();

Отрывок из обработки заполнения дерева. Заполняем корневые папки из нетипового справочника "Назначение номенклатуры".

 
// корневые папки	
Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
|	назначениеНоменклатуры.Наименование КАК Наименование
|ИЗ
|	Справочник.назначениеНоменклатуры КАК назначениеНоменклатуры
|
|УПОРЯДОЧИТЬ ПО
|	Наименование";
РезультатЗапроса = Запрос.Выполнить();

таблицаКорневыхПапок=РезультатЗапроса.Выгрузить();

// 1 шаг проверяем есть ли данные, полученные из настроек в выгружаемой структуре. если нет - удаляем
для каждого стр из ДеревоКаталогаДляСайта.Строки цикл
	естьВТаблице=таблицаКорневыхПапок.НайтиСтроки(новый структура("Наименование",стр.группа));
	если естьВТаблице.количество()>0 тогда // группа в настройках обмена есть в выгружаемой структуре
	иначе // в выгружаемой структуре нет такой группы - нужно ее удалить из дерева
		ДеревоКаталогаДляСайта.Строки.Удалить(стр);
		конецЕсли;		
	конецЦикла;
// 2 шаг пишем в дерево настроек данные структуры
для каждого стрСтрукт из таблицаКорневыхПапок цикл
	ужеЕсть=ДеревоКаталогаДляСайта.Строки.НайтиСтроки(новый структура("группа",стрСтрукт.наименование));
	если ужеЕсть.Количество()=0 тогда // данных нет в настройках
		строкаДереваКаталога=ДеревоКаталогаДляСайта.Строки.Добавить();
		строкаДереваКаталога.группа=стрСтрукт.Наименование;
		строкаДереваКаталога.ИДгруппы=строка(новый УникальныйИдентификатор);
		// номенклатуру тут не указываем
		конецЕсли;
	
конецЦикла;
	
//	конец корневые папки

Дальше я думаю все будет понятно.

Если нет, то можете заказать обработку создания произвольного дерева каталога под ваши требования тут.

В конце концов получается нужная структура для сайта:

создание каталога для битрикс

выгружаем ее на сайт и радуемся

создание каталога для битрикс



Посмотрите также статьи









Нужен 1с программист?

логотип ООО Партнер

телефон программиста 1С 8(495)005-62-29

 skype: live:di-sem

Связь с программистом 1с через телеграм @programmist_1C

Заявка программисту 1С Отправить заявку