воскресенье, 22 февраля 2015 г.

Интеграция 1С-Битрикс и 1С Предприятия УТ – о фильтрации импорта по сегментам номенклатуры

Недавно столкнулась с интересным и  необычным вариантом организации номенклатурного учета в 1С Предприятии УТ.  Необычным, но допустимым в системе  и абсолютно корректным.

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

Импортировать же товар в интернет-магазин было решено именно в разрезе коллекций. На стороне 1С Предприятия коллекции были реализованы, как сегменты номенклатуры. Сегмент номенклатуры в 1С УТ – это по сути результат работы отбора по номенклатуре, который возможен, как по реквизитам номенклатуры, так и по реквизитам  характеристик. На рисунке ниже - пример содержимого сегмента, сформированного с отбором по реквизиту характеристики.

Модуль же обмена УТ, как стандартный, так и из битриксовского дополнения оказался не приспособленным к импорту в интернет-магазин товара, учтенного таким способом.

Фильтрация выгрузки по сегментам – предусмотрена в модуле импорта, но не учитывает того, что у сегмента бывает отбор по реквизиту характеристики. В оригинальном варианте модуля импорта (Управление торговлей, редакция 11.1 (11.1.9.70), версия модуля 4.0.5.2) при фильтрации по такому сегменту выбиралась та номенклатура, которая нужна, но выгружались все ее характеристики, а не только те, реквизиты которых соответствовали настройкам отбора сегмента.

Поэтому я решила кастомизировать битриксовский модуль обмена на стороне 1С.

Очевидным  и самым простым вариантом решения данной задачи было бы исправление запроса  на выборку номенклатуры с характеристиками в функции СформироватьВременныеТаблицыПоИнформацииОТоварахПакета . Но я посмотрела-посмотрела на этот километровый запрос, и поняла, что вклиниваться в него боюсь, тем более, что данный запрос битриксоиды видоизменяют с выходом новых обновлений версий УТ и модуля обмена, и поддерживать каждый раз его модификацию было бы для меня слишком трудоемко. (А вот если бы сами битриксоиды допилили его – было бы круто).

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

ИспользуетсяОтборПоСегментуНоменклатуры = Ложь;
Отбор = КомпоновщикНастроек.Настройки.Отбор;
ПолеСегмент = Новый ПолеКомпоновкиДанных("СегментНоменклатуры");

Для Каждого ЭлементОтбора Из Отбор.Элементы Цикл
Если ЭлементОтбора.ЛевоеЗначение = ПолеСегмент Тогда
Если ЭлементОтбора.Использование Тогда
СсылкаСегмент=ЭлементОтбора.ПравоеЗначение.Ссылка;
КодСегмента=ЭлементОтбора.ПравоеЗначение.Код;
НаименованиеСегмента=ЭлементОтбора.ПравоеЗначение.Наименование;
ИспользуетсяОтборПоСегментуНоменклатуры = Истина;
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;

Затем я выбрала номенклатуру и характеристики сегмента во вспомогательную таблицу значений, воспользовавшись функцией из ядра УТ.

ТнзСегмента=СегментыСервер.ТаблицаЗначений(СсылкаСегмент);

После этого я нашла пересечение этих двух таблиц, воспользовавшись функцией от сюда>>

Спасибо 1С-нику Кириллову Роману (его можно найти на 1clancer.ru, и он там, кстати, №1) за консультацию по этому вопросу.

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

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




среда, 18 февраля 2015 г.

Как сделать, чтобы импорт каталога из 1С Предприятия в Битрикс шел «туда» (в нужный инфоблок)

Тема стара, как обмен между 1С Предприятие и 1С-Битрикс, но продолжает будоражить умы. Расскажу по шагам, как это делаю я.
Мы провели выгрузку каталога из 1С и видим, что наряду со старым товарным инфоблоком в админке сайта создался новый. Что делать?


1) Идем в настройки – Настройки модулей – Информационные блоки и включаем галочку
«Показывать код загрузки из внешних источников»



2) Далее идем в Магазин – Интеграция с 1С
На самой первой вкладке если тип инфоблока не выбран, выбираем тип инфоблока catalog



3) Удаляем новый инфоблок и новый тип инфоблока и запускаем импорт из 1С по-новой.



4) Теперь мы видим, что инфоблок создался уже в нужном нам типе инфоблоков.
Идем дальше
Открываем новый инфоблок на редактирование, копируем его внешний код
Открываем в соседней вкладке старый инфоблок на редактирование – вставляем туда внешний код



5) Открываем вкладку Свойства обоих инфоблоков в соседних вкладках
Аккуратно ищем в новом инфоблоке свойства, которые есть в старом – по коду, и если такие совпадающие свойства есть – копируем для них внешний код из нового блока в старый. А если они разных типов – то в простом варианте просто удаляем такое свойство из старого инфоблока. В сложном – там надо думать о кастомизации импорта.



Осталось разобраться с ценой. Если это малый бизнес, то открываем файл обмена сохраненный в логах, ищем там внешний код цены и вписываем его во внешний код единственной цены в битриксе.

6) Снова удаляем новый инфоблок, запускаем импорт заново – наслаждаемся попаданием импорта «туда»



7) После этого в настройках каталога в публичной части сайта нужно вывести нужные свойства, перевыбрать тип цены, настроить, какие свойства должны отображаться в умном фильтре а какие – на детальной странице.

воскресенье, 15 февраля 2015 г.

Как настроить mbstring на хостинге Русоникс

Как известно, на хостинге Русоникс можно организовать отдельное web-пространство для каждого размещенного интернет-сайта.



И, соответственно, если сайты работают в разных кодировках, для каждого сайта можно задать свои параметры mbstring.
Для этого в панели управления хостингом заходим  в "Сайты и домены", разворачиваем параметры нужного сайта кнопочкой "Развернуть".



Затем выбираем "Настройки php" и вписываем нужные директивы в поле "Дополнительные директивы"

Нажимаем "ОК". Изменения вступают в силу даже без перезапуска сервера.
Вообще администрировать сервера на хостинге Русоникс очень легко. Для этого не нужно знать ssh команды и разбираться в unix. Не даром у них тарифы называются "Сервер без забот..." А тем, кто регистрирует хостинг по моей реферальной ссылке, я всегда готова оказать помощь.

четверг, 5 февраля 2015 г.

Динамическое изменение шрифта в макете в зависимости от условия

На одном из проектов возникла задача: нужно было в печатной форме документа заказа в 1С УТ сделать, чтобы если количество товара в какой-то строке больше единицы, чтобы название товара и его количество в этой строке выделялись жирным шрифтом.

Решила так: Нашла в УТ обработку ПечатьЗаказовНаТоварыиУслуги, сохранила ее как внешнюю обработку, в полученной внешней обработке в модуле менеджера нашла цикл, выводящий на печать товары, дописала:

Если СтрокаТовары.Количество > 1 Тогда
ОбластьТоварСтроки.ТекущаяОбласть.Шрифт=Новый Шрифт(ОбластьТоварСтроки.ТекущаяОбласть.Шрифт, , 10,Истина);
Иначе
        ОбластьТоварСтроки.ТекущаяОбласть.Шрифт=Новый Шрифт(ОбластьТоварСтроки.ТекущаяОбласть.Шрифт, , 8,Ложь);
КонецЕсли;

Потом чуть ниже, где выводилась сама циферка - количество - дописала:

Если СтрокаТовары.Количество > 1 Тогда
ОбластьДанныхСтроки.ТекущаяОбласть.Шрифт=Новый Шрифт(ОбластьДанныхСтроки.ТекущаяОбласть.Шрифт, , 10,Истина);
Иначе
ОбластьДанныхСтроки.ТекущаяОбласть.Шрифт=Новый
Шрифт(ОбластьДанныхСтроки.ТекущаяОбласть.Шрифт, , 8,Ложь);
КонецЕсли;

Вот так вот. Из интересного было то, что свойство шрифта напрямую на запись недоступно - только через создание нового объекта шрифта. Ну, это логично.