7.7 Назначение родителя элементу

Тема в разделе "Отчеты и обработки для "1С:Предприятие 7.7"", создана пользователем DiNYT, 18 авг 2013.

  1. TopicStarter Overlay
    DiNYT
    Offline

    DiNYT

    Регистрация:
    18 авг 2013
    Сообщения:
    5
    Симпатии:
    0
    Баллы:
    1
    Всем доброго времени суток.
    Передо мной возникла следующая задача: мне необходимо выгрузить документы из одной базы для последующей их загрузки в другую.
    Выгрузку делаю по одному документу. В файл выгружаются следующие данные:
    - инфа о документе
    - табличная часть документа
    - инфа о товарах, присутствующих в документе
    - инфа о ценах данных товаров
    С выгрузкой проблем у меня нет.

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

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

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


    Вот с помощью этой функции я делаю разбор пути (сам путь выгружается в виде "===== ТОВАРЫ =====/Группа 26", с разделителем "/")

    Код:
    Функция ПолучитьРодителяПоПути(Путь, Справочник)
    [indent=1]Перем Тов, сзГр;[/indent]
    [indent=1]Перем Сч, Колво, Стр, Ст;[/indent]
    [indent=1]Перем Длина, Поз;[/indent]
    
    [indent=1]Тов = СоздатьОбъект(Справочник);[/indent]
    [indent=1]Тов.ВыбратьЭлементы();[/indent]
    [indent=1]сзГр = СоздатьОбъект("СписокЗначений");[/indent]
    
    [indent=1]// Разбор пути[/indent]
    [indent=1]Стр = Путь;[/indent]
    [indent=1]Длина = СтрДлина(Стр);[/indent]
    [indent=1]Поз = Найти(Стр, "/");[/indent]
    [indent=1]Пока (Поз > 0) Цикл[/indent]
    [indent=2]Ст =  Лев(Стр, Поз - 1);[/indent]
    [indent=2]Стр = Прав(Стр, Длина - Поз);[/indent]
    [indent=2]Поз = Найти(Стр, "/");[/indent]
    [indent=2]Длина = СтрДлина(Стр);[/indent]
    [indent=2]сзГр.ДобавитьЗначение(Ст);[/indent]
    [indent=1]КонецЦикла;[/indent]
    [indent=1]Если (Стр <> "") Тогда[/indent]
    [indent=1]сзГр.ДобавитьЗначение(Стр);[/indent]
    [indent=1]КонецЕсли;[/indent]
    
    [indent=1]//Определение родителя, в случае необходимости создаются недостающие элементы[/indent]
    [indent=1]Колво = сзГр.РазмерСписка();[/indent]
    [indent=1]Для Сч = 1 По Колво Цикл[/indent]
    [indent=2]Стр = сзГр.ПолучитьЗначение(Сч);[/indent]
    [indent=2]Если (Тов.НайтиПоНаименованию(Стр) = 1) Тогда[/indent]
    [indent=3]Тов.ИспользоватьРодителя(Тов.ТекущийЭлемент());[/indent]
    [indent=3]Тов.ВыбратьЭлементы();[/indent]
    [indent=2]Иначе[/indent]
    [indent=4]Тов.НоваяГруппа();[/indent]
    [indent=4]Тов.Наименование = Стр;[/indent]
    [indent=4]Тов.Записать();[/indent]
    [indent=4]Тов.ИспользоватьРодителя(Тов.ТекущийЭлемент());[/indent]
    [indent=3]Если (Сч < Колво) Тогда[/indent]
    [indent=4]Тов.ВыбратьЭлементы();[/indent]
    [indent=3]КонецЕсли;[/indent]
    [indent=2]КонецЕсли;[/indent]
    [indent=1]КонецЦикла;[/indent]
    
    [indent=1]Возврат Тов.ТекущийЭлемент();[/indent]
    КонецФункции
    Далее, в коде процедуры обработки загрузки я вызываю данную функцию таким образом:
    (Параметр Пар содержит строку вида: "[ТОВАР]","3545457575","Классный товар 2","Классный товар 2","Поставщик 2"," ","Товар","шт.","","===== ТОВАРЫ =====/Группа 26")
    Процедура ЗагрузитьТовары(Пар)
    Темп = СоздатьОбъект("СписокЗначений");​
    Товары = СоздатьОбъект("Справочник.Товары");​
    Тов2 = СоздатьОбъект("Справочник.Товары");​

    Товары.ВыбратьЭлементы();
    Тов2.ВыбратьЭлементы();
    ...​
    Темп.ИзСтрокиСРазделителями(Пар);​
    ...​
    Если (Товары.НайтиПоКоду(Темп.ПолучитьЗначение(2)) = 0) Тогда​
    Товары.Новый();​
    КонецЕсли​
    // далее идёт перечисление реквизитов товара​
    ...​
    //а далее идет определение родителя для загружаемого товара элемента​
    Тов2 = ПолучитьРодителяПоПути(Темп.ПолучитьЗначение(10), "Справочник.Товары");​
    Товары.Родитель = Тов2;​
    Товары.Записать();​
    КонецПроцедуры

    Проблема возникает в строке Товары.Родитель = Тов2;
    Текст ошибки "Неверное значение!"
    Помогите мне справиться с данной задачей. Что я делаю не так?
    Спасибо.
    PS: Пробовал также ещё такой вариант - сначала записываю реквизиты товара, а затем назначаю этому товару родителя (такой же строкой) и снова сохраняю изменения. Ошибка снова возникает на этой строке.
  2. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Код:
    Группа=ПолучитьПустоеЗначение(Справочник);
    Колво = сзГр.РазмерСписка();
    Для Сч = 1 По Колво Цикл
    Стр = сзГр.ПолучитьЗначение(Сч);
    Если (Тов.НайтиПоНаименованию(Стр) = 1) Тогда
    Группа=Тов.ТекущийЭлемент());
    Иначе
    Тов.НоваяГруппа();
    Тов.Наименование = Стр;
    Тов.Родитель=Группа;
    Тов.Записать();
    Группа=Тов.ТекущийЭлемент();
    КонецЕсли;
    КонецЦикла;
    Возврат Группа;
    
    Не думаю что поиск по наименованию правильное решение...
    А если у вас товар и группа называются одинаково?
  3. TopicStarter Overlay
    DiNYT
    Offline

    DiNYT

    Регистрация:
    18 авг 2013
    Сообщения:
    5
    Симпатии:
    0
    Баллы:
    1
    В предложенном варианте почему то поиск ведется всегда в корневой группе (или мне так кажется?).
    Но вот конкретный пример - полный путь товара в файле записан так: ===== ТОВАРЫ =====/Группа 1
    После разбора, список сзГр будет содержать 2 записи: "===== ТОВАРЫ =====" и "Группа 1". Сам товар должен находиться в группе "Группа 1".
    В момент загрузки файла в базе уже существует группа "Группа 1" в группе "===== ТОВАРЫ =====". Но данный код создает новую группу "Группа 1" в группе "===== ТОВАРЫ =====" (для каждого товара из файла).
    Т.е. группа "Группа 1" не должна создаваться больше, если она есть.
    Как обработать данный момент?
    Спасибо.

    -> А если у вас товар и группа называются одинаково?
    Да, я понимаю, что данное место "узкое" и не очень надежное. Но за наполнением таблицы я слежу сам. Хотя позже нужно будет как-нибудь обыгрывать и эту проблему. Но сейчас "висит" операция загрузки товаров.
  4. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Значит она у вас просто не находит по наименованию группу..
    Впрочем, вы правы. Неточность есть. Нужно вот так:
    Код:
    Группа=ПолучитьПустоеЗначение(Справочник);
    Колво = сзГр.РазмерСписка();
    Для Сч = 1 По Колво Цикл
    Стр = сзГр.ПолучитьЗначение(Сч);
    Тов.ИспользоватьРодителя(Группа);
    Если (Тов.НайтиПоНаименованию(Стр,1,1) = 1) Тогда
    Группа=Тов.ТекущийЭлемент());
    Иначе
    Тов.НоваяГруппа();
    Тов.Наименование = Стр;
    Тов.Родитель=Группа;
    Тов.Записать();
    Группа=Тов.ТекущийЭлемент();
    КонецЕсли;
    КонецЦикла;
    Возврат Группа;
    
  5. TopicStarter Overlay
    DiNYT
    Offline

    DiNYT

    Регистрация:
    18 авг 2013
    Сообщения:
    5
    Симпатии:
    0
    Баллы:
    1
    Данный вариант отработал именно так как и требовалось!
    Задача решена.
    Благодарю. :)

Поделиться этой страницей