Введение. Описание и цель задачи
Привет всем! Прошло несколько месяцев как я написал предыдущую статью в сообществе. Мир с того момента, можно сказать, существенно изменился, и продолжает меняться у нас на глазах. На дворе кризис, обусловленный пандемией вируса COVID-19. Нереальное падение производства, повальные сокращения, запрет на работу целых отраслей. Во-первых, мне хотелось бы поддержать тех ребят-коллег, которые выпали из зоны рабочего комфорта в связи с ранее упомянутыми мной событиями.
И, поэтому, надеюсь, что методический и практический материал данной статьи будет максимально полезен всем, кто развивается и хочет развивать свои навыки программирования в среде 1с в настоящих реалиях пандемии и самоизоляции. Сделав обзор данного материала, вы сможете использовать его в своих задачах, подтянуть свой "скилл программирования", что немаловажно в наше время.
Отмечу, что в данной статье я не буду описывать "теоретическое поведение сферического коня в вакууме" и с гордостью приводить результаты вычисления "квадратного корня из этого коня", сравнивая его со среднепотолочным значением.
Цель данной статьи - привести надежный и практический пример работы с такой "любимой" всеми конфигурации как "Конвертация данных 2.1", а именно представить и подробно описать пример по переносу остатков из одной конфигурации в другую. По своему опыту могу сказать, что даже опытные программисты, имеющие за своими плечами написания десятков или даже сотен правил конвертации - все равно делают ошибки и косяки, когда пишут правила. Я осторожно напишу, что конвертацию данных (обмены) можно изучать бесконечно....
Итак, давайте перейдем к подходу и реализации задачи.
Подход к реализации задачи.
В качестве начальных условий возьмем две конфигурации - пусть конфигурация источник (откуда будем выгружать данные) будет УТ 10.3 (старенькая, да), а конфигурация приемник (куда загружать) - Розница 2.3. Вот так. Переносить будем остатки.
Первым шагом я "сниму образы конфигураций" - выгружу описания структуры метаданных обеих баз данных с помощью прилагаемых обработок MD83Exp.epf для Розницы (УФ) и MD82Exp.epf для старенькой торговли УТ 10.3.
Делается это так:
Просто открывается соответствующая обработка выгрузки метаданных под управляемыми формами или обычным, выбирается путь и название сохранения файла со структурой и нажимается кнопка "Выгрузить".
Рис.1 Выгрузка метаданных из конфигурации "Розница 2.3" в xml-файл.
Затем, я загружаю эти образы в мою подготовленную конфигурацию "Конвертация данных 2.1". Здесь тоже нет ничего сложного конечно.
Рис 2. Загрузка структуры метаданных выгруженных конфигураций.
Отмечу, что по-привычке, я всегда сначала загружаю данные в "новую" конфигурацию из образа. А потом уже решаю, модифицировать мне что-то или нет.
Теперь, мы переходим к следующему разделу - "Создание правил обмена".
Создание правил обмена "Управление торговлей 10.3 -> Розница 2.3"
Какую задачу мы ставим перед собой? Создать правила переноса остатков склада из УТ 10.3 в Розницу 2.3. Посмотрим каким документом создается ввод остатков в типовой рознице. Понимаем, что ввод остатков в типовой Рознице - это документ "Оприходование товаров". Значит, нам нужно написать правило конвертации, создающее этот документ.
Смотрим дальше, что нам потребуется для заполнения этого документа - это, конечно, перенос справочника "Номенклатура" из УТ 10.3 и, возможно, перенос справочника "Склады" (но, об этом мы подумаем чуть позже, нужен ли он нам будет).
"Разгоняемся" на переносе справочника "Номенклатура".
Итак, я пишу первое правило конвертации справочника "Номенклатуры" УТ 10.3 -> Розница 2.3.
Создаю новые правила, вопрос "Конвертация не содержит..." просто закрываю:
Рис 3. Создание новой конвертации.
Далее, я создаю вручную правило конвертации объектов Номенклатура - Номенклатура:
Рис 4. Сопоставление объектов Источник-Приемник.
На запрос "Создать автоматически правила конвертации" я всегда отвечаю отрицательно:
Рис 5. Отказ от использования автоматического создания правил для прлчиненных объектов.
Я самостоятельно подбираю свойства в Приемнике - Рознице, те, являются обязательными к заполнению. В итоге, я должен получить примерно вот такие правила:
Рис 6. "Готовые правила" переноса номенклатуры.
Здесь нет ничего сложного - источник переносится в приемник, единственное, что нужно "настроить в источнике" - это свойство "ТипНоменклатуры".
Пишем простое правило конвертации свойств (ПКС) для него (событие "Перед выгрузкой"):
Если Источник.ЭтоГруппа = Ложь Тогда
Значение = Источник.ВидНоменклатуры.ТипНоменклатуры;
КонецЕсли;
выглядит это вот так:
Рис 7. ПКС "ТипНоменклатуры".
Так же нужно сопоставить Перечисления "ТипыНоменклатуры":
Рис 8. Сопоставление перечислений "Источник-Приемник".
На вспомогательном справочнике "Единицы измерения" поставлю галки, чтобы исключить дубли в "Приемнике", предварительно отметив поля, по которым продолжать поиск - в данном случае "Наименование".
Рис 9. Настройки ПКО для вспомогательного справочников единиц измерения.
Все, сохраняю правила и использую их в конфигурации "УТ 10.3"
Рис 10. Выгружаем через универсальных обмен.
Загружаю файл с данными через "Универсальный обмен данным в формате XML" в Рознице и проверяю элементы номенклатуры.
Рис 11. Элемент справочника номенклатура в Рознице.
в УТ вот так:
Рис 12. Этот же элемент справочника номенклатура в старой УТ 10.3.
Все выгрузилось корректно, необходимые значения все заполнены, вспомогательные справочники - не задублировались. Код справочника "Номенклатура" присвоен в рамках конфигурации "Приемника".
Так же проверим вспомогательный справочник, "Единицы измерения", зная, что в УТ - куча единиц измерений на каждую позицию. В Рознице, у нас только одна ссылка на единицу измерения "шт".
Рис 13. Элементы справочника "Базовые единицы измерения".
Все работает, теперь, доработаем эти правила для переноса остатков, в чем и заключается наша основная цель.
Перенос остатков в документ "Оприходование товаров"
С чего начинаем:
Я начинаю с написания ПКО (правила конвертации объекта) документа "Оприходование товаров" из "пустоты" (объект источник пустой). Выглядит это вот так:
Рис 14. Правило конвертации объектов - "ОприходованиеТоваров" из "пустоты".
Далее, создаем правило выгрузки данных для этого документа по произвольному алгоритму:
Рис 15. Правило выгрузки данных для "ОприходованиеТоваров" по произвольному алгоритму.
Произвольный алгоритм помещаем в метод ПВД "Перед обработкой". Вот так:
Рис 16. Произвольный алгоритм "Перед обработкой" в ПВД.
Код выгрузки должен быть примерно такой (пишу на скорую руку, "не вникая особо" в реквизиты и его "красивость"):
//********************************
ВыборкаДанных = Новый ТаблицаЗначений;
ВыборкаДанных.Колонки.Добавить("Организация");
ВыборкаДанных.Колонки.Добавить("Номер");
ВыборкаДанных.Колонки.Добавить("Дата");
ВыборкаДанных.Колонки.Добавить("АналитикаХозяйственнойОперации");
ВыборкаДанных.Колонки.Добавить("Комментарий");
ВыборкаДанных.Колонки.Добавить("Контрагент");
ВыборкаДанных.Колонки.Добавить("Склад");
ВыборкаДанных.Колонки.Добавить("Магазин");
ВыборкаДанных.Колонки.Добавить("СуммаДокумента");
ВыборкаДанных.Колонки.Добавить("Товары");
//********************************
Товары = Новый ТаблицаЗначений;
Товары.Колонки.Добавить("Номенклатура");
Товары.Колонки.Добавить("Количество");
Товары.Колонки.Добавить("Упаковка");
Товары.Колонки.Добавить("Характеристика");
Товары.Колонки.Добавить("КоличествоУпаковок");
Товары.Колонки.Добавить("Цена");
Товары.Колонки.Добавить("Сумма");
Товары.Колонки.Добавить("СтатусУказанияСерий");
Товары.Колонки.Добавить("АлкогольнаяПродукция");
Товары.Колонки.Добавить("НомерГТД");
//********************************
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
| ТоварыНаСкладахОстатки.КоличествоОстаток КАК Количество
|ПОМЕСТИТЬ ВТ_ТоварыНаСкладе
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаОстатков, Склад = &Склад) КАК ТоварыНаСкладахОстатки
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ЦеныНоменклатурыСрезПоследних.Цена,
| ЦеныНоменклатурыСрезПоследних.Номенклатура
|ПОМЕСТИТЬ ВТ_СрезЦен
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаОстатков, ТипЦен = &ТипЦены) КАК ЦеныНоменклатурыСрезПоследних
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_ТоварыНаСкладе.Номенклатура КАК Номенклатура,
| ВТ_ТоварыНаСкладе.Количество КАК Количество,
| ВТ_СрезЦен.Цена КАК Цена
|ИЗ
| ВТ_ТоварыНаСкладе КАК ВТ_ТоварыНаСкладе
| ЛЕВОЕ СОЕДИНЕНИЕ ВТ_СрезЦен КАК ВТ_СрезЦен
| ПО ВТ_ТоварыНаСкладе.Номенклатура = ВТ_СрезЦен.Номенклатура
|АВТОУПОРЯДОЧИВАНИЕ";
Запрос.УстановитьПараметр("ДатаОстатков", Параметры.ДатаВыгрузки);
Запрос.УстановитьПараметр("Склад", Параметры.Склад);
Запрос.УстановитьПараметр("ТипЦены", Параметры.ТипЦеныОстатков);
РезультатЗапроса = Запрос.Выполнить().Выбрать();
СтрокаДокумента = ВыборкаДанных.Добавить();
СтрокаДокумента.Дата = Параметры.ДатаВыгрузки;
//********************************
Пока РезультатЗапроса.Следующий() Цикл
НоваяСтрокаТовары = Товары.Добавить();
НоваяСтрокаТовары.Номенклатура = РезультатЗапроса.Номенклатура;
НоваяСтрокаТовары.Количество = РезультатЗапроса.Количество;
НоваяСтрокаТовары.КоличествоУпаковок = РезультатЗапроса.Количество;
НоваяСтрокаТовары.Цена = РезультатЗапроса.Цена;
НоваяСтрокаТовары.Сумма = РезультатЗапроса.Количество*РезультатЗапроса.Цена;
КонецЦикла;
//********************************
СтрокаДокумента.Товары = Товары;
Здесь, мы создаем таблицу значений ВыгрузкаДанных, где повторяем все реквизиты объекта - приемника (документа в "Рознице"). И как-то их "заполняем".
В данном примере кода - мне важно получить такие реквизиты табличной части Товары как Номенклатура, Количество, Цена (определенного типа) на выбранную дату.
Как вы видите, здесь я использую Параметры конвертации: ДатаВыгрузки, Склад, ТипыЦенОстатков
Данные параметры, я внесу на одноименной закладке правил:
Рис 16. Все параметры нашей конвертации УТ 10.3 - > Розница 2.3.
Так же, как видите, у меня присутствуют еще 2 параметра МагазинЗагрузки и СкладЗагрузки - о них я напишу чуть дальше.
Теперь, возвращаемся в ПКО объекта "Оприходование товаров" в метод "После загрузки" и заполним в нем "Шапку" нашего создаваемого документа:
Рис 17. Работаем с объектов в базе "Розница 2.3", используя метод "После загрузки".
Объект - это наш создаваемый документ "Оприходование товаров" в "Рознице". Здесь, как можно видеть, при заполнении Склада и Магазина, я использую "выгружаемые" (установлены галки) параметры, которые вводит пользователь.
В методе "Перед загрузкой", я добавляю вот такую строчку
РежимЗаписи = "Запись";
В принципе, наши правила готовы, сохраняем их и переходим к тестам выгрузки-загрузки в следующем разделе.
Тестирование работы
Открываем "Универсальный обмен данными в формате XML" в конфигурации УТ 10.3.
Рис 18. Используем правила в "Универсальном обмене".
Переходим на закладку параметры и заполняем их. Пользователь правил скопи-пастит название "МагазинЗагрузки" и "СкладЗагрузки" из "Розницы"
Рис 19. Заполняем параметры выгрузки.
Выгружаем данные в файл. Открываем универсальный обмен в "Рознице" и загружаем созданный файл выгрузки (не правила).
Смотрим, что загрузилось. Загрузился ВЕСЬ справочник Номенклатуры (у меня он порядка 17 тыс. элементов) и создался документ "Оприходования товаров".
Рис 20. Созданный документ в базе "Розница".
Нам весь справочник номенклатуры не нужен, поэтому в ранее скопированную базу выгружаем по этим же правилам, но снимем галки со всех справочников.
Рис 21. Выгружаем только один документ "Оприходование товаров".
Так же, выгрузился документ "Оприходование товаров" и объекты, которые в нем используются. Это порядка 1 тыс. номенклатуры. То, что нам и нужно. Тестирование прошло успешно.
Выводы
Благодарю всех, кто прочитал данную статью до конца. Я постарался максимально подробно "разжевать" такую базовую работу с конфигурацией "Конвертация данных 2.1". В статье, я затронул описание ПКО, ПКС и использование параметров.
Так же показан подход к переносу остатков по свободному алгоритму (а не совсем тривиальный вариант Документ - > Документ). Каждый шаг переноса я проверил и объяснил, выявляя ошибки (недочеты) правил - исправлял их "по-ходу" статьи, объясняя свои действия.
Если вам понравилась эта статья, прошу поддержать ее. В свою очередь, я обещаю написать еще несколько статей по конвертации данных, охватив все базовые подходы и методы данной конфигурации.
Прошу ознакомиться с моими предыдущими материалами по ссылкам в разделе "Предыдущие материалы".
Всем большое спасибо! До новых встреч!
Предыдущие материалы
Так же, я прошу посмотреть мои предыдущие статьи:
Динамический список. Апгрейд справочника "Номенклатура" типовой конфигурации с помощью расширения
Лайфхак работы с СКД. Собираем отчет
СКД. Лайфхак №2. Собираем отчет еще удобнее
СКД. Шаг 3. Используем макеты для оформления отчета
Обсудим планы обмена. Способы регистрации объектов к обмену
Боремся с запросами в циклах. Мой опыт рефакторинга запросов