РК_ЗагрузкаЦен 1.3.1.99: загрузка актуальных цен из исходной ИБ (#18)

Обработка в crm3-26.rhana вызывает Transfer API исходной базы, сопоставляет виды цен и номенклатуру и создаёт УстановкаЦенНоменклатуры. Канон: rhana/crm3-migration#20.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
mihailkudravcev
2026-08-20 14:35:24 +03:00
parent d2aa3cd03e
commit b07b7c96d6
13 changed files with 3427 additions and 6 deletions
@@ -0,0 +1,584 @@
////////////////////////////////////////////////////////////////////////////////
// Загрузка актуальных цен продаж из исходной ИБ через Transfer API.
// https://git.p7net.ru/1c/crm3_26.rhana/issues/18
////////////////////////////////////////////////////////////////////////////////
#Область ПрограммныйИнтерфейс
Процедура ЗаполнитьВидыЦенИзОтветаAPI(Ответ, Очищать = Истина) Экспорт
Если Очищать Тогда
ВидыЦенИсточника.Очистить();
КонецЕсли;
Строки = ЗначениеСвойства(Ответ, "rows", Неопределено);
Если ТипЗнч(Строки) <> Тип("Массив") Тогда
Возврат;
КонецЕсли;
Для Каждого СтрокаAPI Из Строки Цикл
НовСтр = ВидыЦенИсточника.Добавить();
НовСтр.Отметка = Истина;
НовСтр.Идентификатор = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "guid", "")));
НовСтр.Наименование = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "name", "")));
НовСтр.ВалютаКод = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "currency_code", "")));
НовСтр.ЦенаВключаетНДС = БулевоИзЗначения(ЗначениеСвойства(СтрокаAPI, "vat_included", Ложь));
НовСтр.СпособЗаданияЦены = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "method", "")));
НовСтр.БазовыйВидЦеныНаименование = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "base_type_name", "")));
НовСтр.Наценка = ЧислоИзЗначения(ЗначениеСвойства(СтрокаAPI, "markup", 0), 0);
НовСтр.ИспользоватьПриПродаже = БулевоИзЗначения(ЗначениеСвойства(СтрокаAPI, "use_for_sale", Истина));
НовСтр.ПометкаУдаления = БулевоИзЗначения(ЗначениеСвойства(СтрокаAPI, "deletion_mark", Ложь));
НовСтр.СтатусСопоставления = "";
НовСтр.Комментарий = "";
КонецЦикла;
КонецПроцедуры
Функция СопоставитьВидыЦен(РежимТест) Экспорт
Найдено = 0;
Создано = 0;
НеНайдено = 0;
Для Каждого СтрТ Из ВидыЦенИсточника Цикл
ВЦ = НайтиВидЦеныСтроки(СтрТ);
Если ЗначениеЗаполнено(ВЦ) Тогда
СтрТ.ВидЦены = ВЦ;
СтрТ.СтатусСопоставления = "Найден";
СтрТ.Комментарий = "";
Найдено = Найдено + 1;
Продолжить;
КонецЕсли;
Если СоздаватьОтсутствующиеВидыЦен И СтрТ.Отметка Тогда
Если РежимТест Тогда
СтрТ.СтатусСопоставления = "К созданию";
СтрТ.Комментарий = "Будет создан вид цен «" + СтрТ.Наименование + "»";
Создано = Создано + 1;
Иначе
ВЦ = СоздатьВидЦеныСтроки(СтрТ);
Если ЗначениеЗаполнено(ВЦ) Тогда
СтрТ.ВидЦены = ВЦ;
СтрТ.СтатусСопоставления = "Создан";
СтрТ.Комментарий = "";
Создано = Создано + 1;
Иначе
СтрТ.СтатусСопоставления = "Ошибка создания";
НеНайдено = НеНайдено + 1;
КонецЕсли;
КонецЕсли;
Иначе
СтрТ.ВидЦены = Справочники.ВидыЦен.ПустаяСсылка();
СтрТ.СтатусСопоставления = "Не найден";
СтрТ.Комментарий = "Нет вида цен с наименованием «" + СтрТ.Наименование + "»";
НеНайдено = НеНайдено + 1;
КонецЕсли;
КонецЦикла;
Возврат "Видов цен: найдено " + Формат(Найдено, "ЧН=0; ЧГ=0")
+ ", создано/к созданию " + Формат(Создано, "ЧН=0; ЧГ=0")
+ ", не найдено " + Формат(НеНайдено, "ЧН=0; ЧГ=0");
КонецФункции
Процедура ЗаполнитьВходящиеЦеныИзОтветаAPI(Ответ, Очищать = Истина) Экспорт
Если Очищать Тогда
ВходящиеЦены.Очистить();
КонецЕсли;
Строки = ЗначениеСвойства(Ответ, "rows", Неопределено);
Если ТипЗнч(Строки) <> Тип("Массив") Тогда
Возврат;
КонецЕсли;
Для Каждого СтрокаAPI Из Строки Цикл
НовСтр = ВходящиеЦены.Добавить();
ПериодТекст = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "period", "")));
Если ЗначениеЗаполнено(ПериодТекст) Тогда
Попытка
НовСтр.Период = XMLЗначение(Тип("Дата"), ПериодТекст);
Исключение
КонецПопытки;
КонецЕсли;
НовСтр.НоменклатураИдентификатор = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "nomenclature_guid", "")));
НовСтр.Артикул = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "nomenclature_article", "")));
НовСтр.НоменклатураКод = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "nomenclature_code", "")));
НовСтр.НоменклатураНаименование = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "nomenclature_name", "")));
НовСтр.ХарактеристикаИдентификатор = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "characteristic_guid", "")));
НовСтр.ХарактеристикаНаименование = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "characteristic_name", "")));
НовСтр.ВидЦеныИдентификатор = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "price_type_guid", "")));
НовСтр.ВидЦеныНаименование = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "price_type_name", "")));
НовСтр.Цена = ЧислоИзЗначения(ЗначениеСвойства(СтрокаAPI, "price", 0), 0);
НовСтр.ВалютаКод = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "currency_code", "")));
НовСтр.УпаковкаНаименование = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "package_name", "")));
НовСтр.Сопоставлено = Ложь;
НовСтр.ЗагруженоВДокумент = Ложь;
КонецЦикла;
КонецПроцедуры
Функция СопоставитьВходящиеЦены() Экспорт
Сопоставлено = 0;
Пропущено = 0;
СРазрывом = 0;
КартаВидов = КартаВидовЦенИсточника();
Для Каждого СтрТ Из ВходящиеЦены Цикл
СтрТ.КомментарийСопоставления = "";
СтрТ.РазрывДетализации = "";
СтрТ.ИспользоватьСерииСклад = "";
СтрТ.КлючЦенПоСерии = "";
СтрТ.ТекущаяЦенаЦель = 0;
Ном = НайтиНоменклатуруСтроки(СтрТ);
СтрТ.Номенклатура = Ном;
Если Не ЗначениеЗаполнено(Ном) Тогда
СтрТ.Сопоставлено = Ложь;
Если ПустаяСтрока(СтрТ.КомментарийСопоставления) Тогда
СтрТ.КомментарийСопоставления = "Номенклатура не найдена";
КонецЕсли;
Пропущено = Пропущено + 1;
Продолжить;
КонецЕсли;
ВЦ = Неопределено;
КлючВЦ = НРег(СокрЛП(СтрТ.ВидЦеныИдентификатор));
Если ЗначениеЗаполнено(КлючВЦ) Тогда
ВЦ = КартаВидов.Получить(КлючВЦ);
КонецЕсли;
Если Не ЗначениеЗаполнено(ВЦ) Тогда
ВЦ = Справочники.ВидыЦен.НайтиПоНаименованию(СокрЛП(СтрТ.ВидЦеныНаименование), Истина);
КонецЕсли;
СтрТ.ВидЦены = ВЦ;
Если Не ЗначениеЗаполнено(ВЦ) Тогда
СтрТ.Сопоставлено = Ложь;
СтрТ.КомментарийСопоставления = "Вид цены не найден: " + СтрТ.ВидЦеныНаименование;
Пропущено = Пропущено + 1;
Продолжить;
КонецЕсли;
ЗаполнитьПолитикуСерийСтроки(СтрТ, Ном);
СтрТ.ТекущаяЦенаЦель = ТекущаяЦенаЦелевойИБ(Ном, ВЦ);
СтрТ.Сопоставлено = Истина;
Сопоставлено = Сопоставлено + 1;
Если ЗначениеЗаполнено(СтрТ.РазрывДетализации) Тогда
СРазрывом = СРазрывом + 1;
КонецЕсли;
КонецЦикла;
Возврат "Сопоставлено " + Формат(Сопоставлено, "ЧН=0; ЧГ=0")
+ ", пропущено " + Формат(Пропущено, "ЧН=0; ЧГ=0")
+ ", с разрывом серий/ключа цен " + Формат(СРазрывом, "ЧН=0; ЧГ=0");
КонецФункции
Функция СоздатьДокументыУстановкиЦен(РежимТест) Экспорт
ИспЦО25 = Ложь;
Попытка
ИспЦО25 = ЦенообразованиеВызовСервера.ИспользуетсяЦенообразование25();
Исключение
ИспЦО25 = Ложь;
КонецПопытки;
ДатаУстановки = ДатаДокументов;
Если Не ЗначениеЗаполнено(ДатаУстановки) Тогда
ДатаУстановки = ТекущаяДатаСеанса();
КонецЕсли;
КомментарийБаза = СокрЛП(КомментарийДокументов);
Если ПустаяСтрока(КомментарийБаза) Тогда
КомментарийБаза = "Перенос цен из crm3-dev";
КонецЕсли;
Группы = Новый Соответствие;
ПорядокГрупп = Новый Массив;
Для Каждого СтрТ Из ВходящиеЦены Цикл
Если Не СтрТ.Сопоставлено Или СтрТ.ЗагруженоВДокумент Тогда
Продолжить;
КонецЕсли;
Если Не ЗначениеЗаполнено(СтрТ.Номенклатура) Или Не ЗначениеЗаполнено(СтрТ.ВидЦены) Тогда
Продолжить;
КонецЕсли;
КлючГр = Строка(СтрТ.ВидЦены);
Список = Группы.Получить(КлючГр);
Если Список = Неопределено Тогда
Список = Новый Массив;
Группы.Вставить(КлючГр, Список);
ПорядокГрупп.Добавить(СтрТ.ВидЦены);
КонецЕсли;
Список.Добавить(СтрТ);
КонецЦикла;
СозданоДок = 0;
ПропущеноСтрок = 0;
Ошибок = 0;
МаксСтрок = 500;
Если Не РежимТест Тогда
СозданныеДокументы.Очистить();
КонецЕсли;
Для Каждого ВидЦеныГр Из ПорядокГрупп Цикл
СтрокиГр = Группы.Получить(Строка(ВидЦеныГр));
Если СтрокиГр = Неопределено Или СтрокиГр.Количество() = 0 Тогда
Продолжить;
КонецЕсли;
Индекс = 0;
НомерПакета = 0;
Пока Индекс < СтрокиГр.Количество() Цикл
НомерПакета = НомерПакета + 1;
КонецПакета = Мин(Индекс + МаксСтрок, СтрокиГр.Количество());
Пакет = Новый Массив;
Для Инд = Индекс По КонецПакета - 1 Цикл
Пакет.Добавить(СтрокиГр[Инд]);
КонецЦикла;
Индекс = КонецПакета;
Если РежимТест Тогда
СозданоДок = СозданоДок + 1;
Продолжить;
КонецЕсли;
Попытка
Док = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
Док.Дата = ДатаУстановки + (НомерПакета - 1);
Док.Комментарий = КомментарийБаза + " / " + Строка(ВидЦеныГр);
Док.Статус = Перечисления.СтатусыУстановокЦенНоменклатуры.Согласован;
Док.Согласован = Истина;
Док.Ответственный = Пользователи.ТекущийПользователь();
СтрВЦ = Док.ВидыЦен.Добавить();
СтрВЦ.ВидЦены = ВидЦеныГр;
КлючиВДок = Новый Соответствие;
Для Каждого СтрТ Из Пакет Цикл
КлючСтр = НРег(XMLСтрока(СтрТ.Номенклатура.УникальныйИдентификатор())) + "|"
+ НРег(СокрЛП(СтрТ.ХарактеристикаНаименование)) + "|"
+ НРег(XMLСтрока(СтрТ.ВидЦены.УникальныйИдентификатор()));
Если КлючиВДок.Получить(КлючСтр) <> Неопределено Тогда
ПропущеноСтрок = ПропущеноСтрок + 1;
Продолжить;
КонецЕсли;
КлючиВДок.Вставить(КлючСтр, Истина);
ВалютаСсылка = Справочники.Валюты.ПустаяСсылка();
Если ЗначениеЗаполнено(СтрТ.ВалютаКод) Тогда
ВалютаСсылка = Справочники.Валюты.НайтиПоКоду(СокрЛП(СтрТ.ВалютаКод));
КонецЕсли;
Упак = Справочники.УпаковкиЕдиницыИзмерения.ПустаяСсылка();
Если ЗначениеЗаполнено(СтрТ.УпаковкаНаименование) Тогда
Упак = Справочники.УпаковкиЕдиницыИзмерения.НайтиПоНаименованию(СокрЛП(СтрТ.УпаковкаНаименование), Истина);
КонецЕсли;
Если ИспЦО25 Тогда
НовСтр = Док.Товары2_5.Добавить();
НовСтр.Номенклатура = СтрТ.Номенклатура;
НовСтр.ХарактеристикаЦО = Справочники.ХарактеристикиНоменклатурыДляЦенообразования.ПустаяСсылка();
НовСтр.СерияЦО = Справочники.СерииНоменклатурыДляЦенообразования.ПустаяСсылка();
НовСтр.УпаковкаЦО = Справочники.УпаковкиЕдиницыИзмерения.ПустаяСсылка();
НовСтр.Упаковка = Упак;
НовСтр.ВидЦены = СтрТ.ВидЦены;
НовСтр.Цена = СтрТ.Цена;
НовСтр.Валюта = ВалютаСсылка;
НовСтр.ЦенаИзмененаВручную = Истина;
Иначе
НовСтр = Док.Товары.Добавить();
НовСтр.Номенклатура = СтрТ.Номенклатура;
НовСтр.Упаковка = Упак;
НовСтр.ВидЦены = СтрТ.ВидЦены;
НовСтр.Цена = СтрТ.Цена;
НовСтр.Валюта = ВалютаСсылка;
НовСтр.ЦенаИзмененаВручную = Истина;
Если ЗначениеЗаполнено(СтрТ.ХарактеристикаНаименование) Тогда
Хар = Справочники.ХарактеристикиНоменклатуры.НайтиПоНаименованию(
СокрЛП(СтрТ.ХарактеристикаНаименование), Истина, , СтрТ.Номенклатура);
Если ЗначениеЗаполнено(Хар) Тогда
НовСтр.Характеристика = Хар;
КонецЕсли;
КонецЕсли;
КонецЕсли;
СтрТ.ЗагруженоВДокумент = Истина;
КонецЦикла;
Если (Док.Товары.Количество() + Док.Товары2_5.Количество()) = 0 Тогда
Продолжить;
КонецЕсли;
Док.Записать(РежимЗаписиДокумента.Проведение);
СозданоДок = СозданоДок + 1;
СтрДок = СозданныеДокументы.Добавить();
СтрДок.ДокументПредставление = Строка(Док);
СтрДок.ВидЦены = ВидЦеныГр;
СтрДок.КоличествоСтрок = Док.Товары.Количество() + Док.Товары2_5.Количество();
СтрДок.Комментарий = Док.Комментарий;
Для Каждого СтрТ Из Пакет Цикл
Если СтрТ.ЗагруженоВДокумент Тогда
СтрТ.ДокументПредставление = Строка(Док);
КонецЕсли;
КонецЦикла;
Исключение
Ошибок = Ошибок + 1;
ТекстОш = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
Для Каждого СтрТ Из Пакет Цикл
СтрТ.ЗагруженоВДокумент = Ложь;
СтрТ.КомментарийСопоставления = СокрЛП(СтрТ.КомментарийСопоставления + " " + ТекстОш);
КонецЦикла;
КонецПопытки;
КонецЦикла;
КонецЦикла;
Возврат "Документов=" + Формат(СозданоДок, "ЧН=0; ЧГ=0")
+ ", пропущено строк=" + Формат(ПропущеноСтрок, "ЧН=0; ЧГ=0")
+ ", ошибок=" + Формат(Ошибок, "ЧН=0; ЧГ=0")
+ ", ЦО 2.5=" + ?(ИспЦО25, "Да", "Нет")
+ ?(РежимТест, " (тест)", "");
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция КартаВидовЦенИсточника()
Карта = Новый Соответствие;
Для Каждого СтрТ Из ВидыЦенИсточника Цикл
Если ЗначениеЗаполнено(СтрТ.ВидЦены) И ЗначениеЗаполнено(СтрТ.Идентификатор) Тогда
Карта.Вставить(НРег(СокрЛП(СтрТ.Идентификатор)), СтрТ.ВидЦены);
КонецЕсли;
КонецЦикла;
Возврат Карта;
КонецФункции
Функция НайтиВидЦеныСтроки(СтрТ)
Имя = СокрЛП(СтрТ.Наименование);
Если Не ЗначениеЗаполнено(Имя) Тогда
Возврат Справочники.ВидыЦен.ПустаяСсылка();
КонецЕсли;
ВЦ = Справочники.ВидыЦен.НайтиПоНаименованию(Имя, Истина);
Если ЗначениеЗаполнено(ВЦ) Тогда
Возврат ВЦ;
КонецЕсли;
Возврат Справочники.ВидыЦен.ПустаяСсылка();
КонецФункции
Функция СоздатьВидЦеныСтроки(СтрТ)
Попытка
ОбъектВЦ = Справочники.ВидыЦен.СоздатьЭлемент();
ОбъектВЦ.Наименование = СокрЛП(СтрТ.Наименование);
Если ЗначениеЗаполнено(СтрТ.ВалютаКод) Тогда
ВалютаСсылка = Справочники.Валюты.НайтиПоКоду(СокрЛП(СтрТ.ВалютаКод));
Если ЗначениеЗаполнено(ВалютаСсылка) Тогда
ОбъектВЦ.ВалютаЦены = ВалютаСсылка;
КонецЕсли;
КонецЕсли;
Если ЗначениеЗаполнено(СтрТ.СпособЗаданияЦены) Тогда
Попытка
ОбъектВЦ.СпособЗаданияЦены = Перечисления.СпособыЗаданияЦен[СтрТ.СпособЗаданияЦены];
Исключение
КонецПопытки;
КонецЕсли;
Если Не ЗначениеЗаполнено(ОбъектВЦ.СпособЗаданияЦены) Тогда
Попытка
ОбъектВЦ.СпособЗаданияЦены = Перечисления.СпособыЗаданияЦен.РучноеНазначение;
Исключение
КонецПопытки;
КонецЕсли;
Если ЗначениеЗаполнено(СтрТ.БазовыйВидЦеныНаименование) Тогда
Базовый = Справочники.ВидыЦен.НайтиПоНаименованию(СокрЛП(СтрТ.БазовыйВидЦеныНаименование), Истина);
Если ЗначениеЗаполнено(Базовый) Тогда
ОбъектВЦ.БазовыйВидЦены = Базовый;
КонецЕсли;
КонецЕсли;
ОбъектВЦ.Наценка = СтрТ.Наценка;
ОбъектВЦ.ЦенаВключаетНДС = СтрТ.ЦенаВключаетНДС;
ОбъектВЦ.ИспользоватьПриПродаже = СтрТ.ИспользоватьПриПродаже;
Попытка
ОбъектВЦ.Статус = Перечисления.СтатусыДействияВидовЦен.Действует;
Исключение
КонецПопытки;
ОбъектВЦ.Записать();
Возврат ОбъектВЦ.Ссылка;
Исключение
СтрТ.Комментарий = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
Возврат Справочники.ВидыЦен.ПустаяСсылка();
КонецПопытки;
КонецФункции
Функция НайтиНоменклатуруСтроки(СтрТ)
Ном = Справочники.Номенклатура.ПустаяСсылка();
Арт = СокрЛП(СтрТ.Артикул);
ИмяНом = СокрЛП(СтрТ.НоменклатураНаименование);
КодНом = СокрЛП(СтрТ.НоменклатураКод);
Если ЗначениеЗаполнено(Арт) Тогда
Ном = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", Арт);
КонецЕсли;
Если Не ЗначениеЗаполнено(Ном) И ЗначениеЗаполнено(СтрТ.НоменклатураИдентификатор) Тогда
Попытка
СсылкаПоГуид = Справочники.Номенклатура.ПолучитьСсылку(
Новый УникальныйИдентификатор(СтрТ.НоменклатураИдентификатор));
Если ОбщегоНазначения.СсылкаСуществует(СсылкаПоГуид) Тогда
Ном = СсылкаПоГуид;
КонецЕсли;
Исключение
КонецПопытки;
КонецЕсли;
Если Не ЗначениеЗаполнено(Ном) И ЗначениеЗаполнено(КодНом) Тогда
Ном = Справочники.Номенклатура.НайтиПоКоду(КодНом);
КонецЕсли;
Если Не ЗначениеЗаполнено(Ном) И ЗначениеЗаполнено(ИмяНом) Тогда
Ном = Справочники.Номенклатура.НайтиПоНаименованию(ИмяНом, Истина);
КонецЕсли;
Возврат Ном;
КонецФункции
Процедура ЗаполнитьПолитикуСерийСтроки(СтрТ, Ном)
ВидНом = Неопределено;
Попытка
ВидНом = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ном, "ВидНоменклатуры");
Исключение
Возврат;
КонецПопытки;
Если Не ЗначениеЗаполнено(ВидНом) Тогда
Возврат;
КонецЕсли;
ИспСерии = Ложь;
Попытка
ИспСерии = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ВидНом, "ИспользоватьСерии") = Истина;
Исключение
КонецПопытки;
СтрТ.ИспользоватьСерииСклад = ?(ИспСерии, "Да", "Нет");
КлючСерии = "";
Попытка
ЗначениеКлюча = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ВидНом, "НастройкиКлючаЦенПоСерии");
Если ЗначениеЗаполнено(ЗначениеКлюча) Тогда
КлючСерии = Строка(ЗначениеКлюча);
КонецЕсли;
Исключение
КонецПопытки;
СтрТ.КлючЦенПоСерии = КлючСерии;
Части = Новый Массив;
Если ИспСерии Тогда
Части.Добавить("в цели посерийный складской учёт, в источнике цена без серии");
КонецЕсли;
Если ЗначениеЗаполнено(КлючСерии) И НРег(КлючСерии) <> "не использовать" Тогда
Части.Добавить("ключ цен по серии=" + КлючСерии + "; цена будет общей (СерияЦО пустая)");
КонецЕсли;
СтрТ.РазрывДетализации = СтрСоединить(Части, "; ");
КонецПроцедуры
Функция ТекущаяЦенаЦелевойИБ(Ном, ВидЦены)
ДатаСреза = ДатаЦен;
Если Не ЗначениеЗаполнено(ДатаСреза) Тогда
ДатаСреза = ТекущаяДатаСеанса();
КонецЕсли;
ИспЦО25 = Ложь;
Попытка
ИспЦО25 = ЦенообразованиеВызовСервера.ИспользуетсяЦенообразование25();
Исключение
ИспЦО25 = Ложь;
КонецПопытки;
Запрос = Новый Запрос;
Если ИспЦО25 Тогда
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Цены.Цена КАК Цена
|ИЗ
| РегистрСведений.ЦеныНоменклатуры25.СрезПоследних(
| &Дата,
| Номенклатура = &Номенклатура
| И ВидЦены = &ВидЦены) КАК Цены
|
|УПОРЯДОЧИТЬ ПО
| Цены.Период УБЫВ";
Иначе
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Цены.Цена КАК Цена
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
| &Дата,
| Номенклатура = &Номенклатура
| И ВидЦены = &ВидЦены) КАК Цены";
КонецЕсли;
Запрос.УстановитьПараметр("Дата", ДатаСреза);
Запрос.УстановитьПараметр("Номенклатура", Ном);
Запрос.УстановитьПараметр("ВидЦены", ВидЦены);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() И ТипЗнч(Выборка.Цена) = Тип("Число") Тогда
Возврат Выборка.Цена;
КонецЕсли;
Возврат 0;
КонецФункции
Функция ЗначениеСвойства(Источник, Имя, ПоУмолчанию)
Если Источник = Неопределено Тогда
Возврат ПоУмолчанию;
КонецЕсли;
Если ТипЗнч(Источник) = Тип("Структура") Или ТипЗнч(Источник) = Тип("ФиксированнаяСтруктура") Тогда
Если Источник.Свойство(Имя) Тогда
Возврат Источник[Имя];
КонецЕсли;
Возврат ПоУмолчанию;
КонецЕсли;
Если ТипЗнч(Источник) = Тип("Соответствие") Или ТипЗнч(Источник) = Тип("ФиксированноеСоответствие") Тогда
Значение = Источник.Получить(Имя);
Если Значение = Неопределено Тогда
Возврат ПоУмолчанию;
КонецЕсли;
Возврат Значение;
КонецЕсли;
Возврат ПоУмолчанию;
КонецФункции
Функция ЧислоИзЗначения(Значение, ПоУмолчанию)
Если Значение = Неопределено Или Значение = Null Тогда
Возврат ПоУмолчанию;
КонецЕсли;
Попытка
Возврат Число(Значение);
Исключение
Возврат ПоУмолчанию;
КонецПопытки;
КонецФункции
Функция БулевоИзЗначения(Значение)
Если ТипЗнч(Значение) = Тип("Булево") Тогда
Возврат Значение;
КонецЕсли;
Если Значение = Неопределено Или Значение = Null Тогда
Возврат Ложь;
КонецЕсли;
Стр = НРег(СокрЛП(Строка(Значение)));
Возврат Стр = "true" Или Стр = "1" Или Стр = "да" Или Стр = "истина";
КонецФункции
#КонецОбласти
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xen="http://v8.1c.ru/8.3/xcf/enums" xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.20" >
<Form uuid="a18e1801-18e0-4000-8000-000000000002">
<Properties>
<Name>Форма</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Форма</v8:content>
</v8:item>
</Synonym>
<Comment/>
<FormType>Managed</FormType>
<IncludeHelpInContents>false</IncludeHelpInContents>
<UsePurposes>
<v8:Value xsi:type="app:ApplicationUsePurpose">PlatformApplication</v8:Value>
<v8:Value xsi:type="app:ApplicationUsePurpose">MobilePlatformApplication</v8:Value>
</UsePurposes>
<ExtendedPresentation/>
</Properties>
</Form>
</MetaDataObject>
@@ -0,0 +1,539 @@
<?xml version="1.0" encoding="UTF-8"?>
<Form xmlns="http://v8.1c.ru/8.3/xcf/logform" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:dcscor="http://v8.1c.ru/8.1/data-composition-system/core" xmlns:dcssch="http://v8.1c.ru/8.1/data-composition-system/schema" xmlns:dcsset="http://v8.1c.ru/8.1/data-composition-system/settings" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.20">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Загрузка актуальных цен из исходной базы</v8:content>
</v8:item>
</Title>
<AutoSaveDataInSettings>Use</AutoSaveDataInSettings>
<AutoCommandBar name="ФормаКоманднаяПанель" id="-1"/>
<Events>
<Event name="OnCreateAtServer">ПриСозданииНаСервере</Event>
</Events>
<ChildItems>
<UsualGroup name="ГруппаШапка" id="1">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Параметры</v8:content>
</v8:item>
</Title>
<Group>AlwaysHorizontal</Group>
<Representation>None</Representation>
<ShowTitle>false</ShowTitle>
<ExtendedTooltip name="ГруппаШапкаРасширеннаяПодсказка" id="2"/>
<ChildItems>
<InputField name="ПодключениеКСтороннейБазе" id="3">
<DataPath>Объект.ПодключениеКСтороннейБазе</DataPath>
<ContextMenu name="ПодключениеКСтороннейБазеКонтекстноеМеню" id="4"/>
<ExtendedTooltip name="ПодключениеКСтороннейБазеРасширеннаяПодсказка" id="5"/>
</InputField>
<InputField name="ДатаЦен" id="6">
<DataPath>Объект.ДатаЦен</DataPath>
<ContextMenu name="ДатаЦенКонтекстноеМеню" id="7"/>
<ExtendedTooltip name="ДатаЦенРасширеннаяПодсказка" id="8"/>
</InputField>
<InputField name="ДатаДокументов" id="9">
<DataPath>Объект.ДатаДокументов</DataPath>
<ContextMenu name="ДатаДокументовКонтекстноеМеню" id="10"/>
<ExtendedTooltip name="ДатаДокументовРасширеннаяПодсказка" id="11"/>
</InputField>
<CheckBoxField name="СоздаватьОтсутствующиеВидыЦен" id="12">
<DataPath>Объект.СоздаватьОтсутствующиеВидыЦен</DataPath>
<TitleLocation>Right</TitleLocation>
<CheckBoxType>Auto</CheckBoxType>
<ContextMenu name="СоздаватьОтсутствующиеВидыЦенКонтекстноеМеню" id="13"/>
<ExtendedTooltip name="СоздаватьОтсутствующиеВидыЦенРасширеннаяПодсказка" id="14"/>
</CheckBoxField>
<InputField name="КомментарийДокументов" id="15">
<DataPath>Объект.КомментарийДокументов</DataPath>
<ContextMenu name="КомментарийДокументовКонтекстноеМеню" id="16"/>
<ExtendedTooltip name="КомментарийДокументовРасширеннаяПодсказка" id="17"/>
</InputField>
</ChildItems>
</UsualGroup>
<Pages name="ГруппаСтраницы" id="20">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Страницы</v8:content>
</v8:item>
</Title>
<PagesRepresentation>TabsOnTop</PagesRepresentation>
<ExtendedTooltip name="ГруппаСтраницыРасширеннаяПодсказка" id="21"/>
<ChildItems>
<Page name="ГруппаВидыЦен" id="22">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Виды цен</v8:content>
</v8:item>
</Title>
<ExtendedTooltip name="ГруппаВидыЦенРасширеннаяПодсказка" id="23"/>
<ChildItems>
<Table name="ВидыЦенИсточника" id="200">
<Representation>List</Representation>
<DataPath>Объект.ВидыЦенИсточника</DataPath>
<RowFilter xsi:nil="true"/>
<ContextMenu name="ВидыЦенИсточникаКонтекстноеМеню" id="201"/>
<AutoCommandBar name="ВидыЦенИсточникаКоманднаяПанель" id="202">
<ChildItems>
<Button name="ВидыЦенИсточникаЗагрузитьВидыЦен" id="250">
<Type>CommandBarButton</Type>
<CommandName>Form.Command.ЗагрузитьВидыЦен</CommandName>
<ExtendedTooltip name="ВидыЦенИсточникаЗагрузитьВидыЦенРасширеннаяПодсказка" id="251"/>
</Button>
<Button name="ВидыЦенИсточникаОтметитьВидыЦен" id="252">
<Type>CommandBarButton</Type>
<CommandName>Form.Command.ОтметитьВидыЦен</CommandName>
<ExtendedTooltip name="ВидыЦенИсточникаОтметитьВидыЦенРасширеннаяПодсказка" id="253"/>
</Button>
<Button name="ВидыЦенИсточникаСнятьОтметкуВидовЦен" id="254">
<Type>CommandBarButton</Type>
<CommandName>Form.Command.СнятьОтметкуВидовЦен</CommandName>
<ExtendedTooltip name="ВидыЦенИсточникаСнятьОтметкуВидовЦенРасширеннаяПодсказка" id="255"/>
</Button>
<Button name="ВидыЦенИсточникаСоздатьОтсутствующиеВидыЦен" id="256">
<Type>CommandBarButton</Type>
<CommandName>Form.Command.СоздатьОтсутствующиеВидыЦен</CommandName>
<ExtendedTooltip name="ВидыЦенИсточникаСоздатьОтсутствующиеВидыЦенРасширеннаяПодсказка" id="257"/>
</Button>
</ChildItems>
</AutoCommandBar>
<ExtendedTooltip name="ВидыЦенИсточникаРасширеннаяПодсказка" id="203"/>
<SearchStringAddition name="ВидыЦенИсточникаСтрокаПоиска" id="204">
<AdditionSource>
<Item>ВидыЦенИсточника</Item>
<Type>SearchStringRepresentation</Type>
</AdditionSource>
<ContextMenu name="ВидыЦенИсточникаСтрокаПоискаКонтекстноеМеню" id="205"/>
<ExtendedTooltip name="ВидыЦенИсточникаСтрокаПоискаРасширеннаяПодсказка" id="206"/>
</SearchStringAddition>
<ViewStatusAddition name="ВидыЦенИсточникаСостояниеПросмотра" id="207">
<AdditionSource>
<Item>ВидыЦенИсточника</Item>
<Type>ViewStatusRepresentation</Type>
</AdditionSource>
<ContextMenu name="ВидыЦенИсточникаСостояниеПросмотраКонтекстноеМеню" id="208"/>
<ExtendedTooltip name="ВидыЦенИсточникаСостояниеПросмотраРасширеннаяПодсказка" id="209"/>
</ViewStatusAddition>
<SearchControlAddition name="ВидыЦенИсточникаУправлениеПоиском" id="210">
<AdditionSource>
<Item>ВидыЦенИсточника</Item>
<Type>SearchControl</Type>
</AdditionSource>
<ContextMenu name="ВидыЦенИсточникаУправлениеПоискомКонтекстноеМеню" id="211"/>
<ExtendedTooltip name="ВидыЦенИсточникаУправлениеПоискомРасширеннаяПодсказка" id="212"/>
</SearchControlAddition>
<ChildItems>
<CheckBoxField name="ВидыЦенИсточникаОтметка" id="201">
<DataPath>Объект.ВидыЦенИсточника.Отметка</DataPath>
<EditMode>EnterOnInput</EditMode>
<Width>8</Width>
<CheckBoxType>Auto</CheckBoxType>
<ContextMenu name="ВидыЦенИсточникаОтметкаКонтекстноеМеню" id="202"/>
<ExtendedTooltip name="ВидыЦенИсточникаОтметкаРасширеннаяПодсказка" id="203"/>
</CheckBoxField>
<InputField name="ВидыЦенИсточникаНаименование" id="204">
<DataPath>Объект.ВидыЦенИсточника.Наименование</DataPath>
<EditMode>EnterOnInput</EditMode>
<Width>20</Width>
<ContextMenu name="ВидыЦенИсточникаНаименованиеКонтекстноеМеню" id="205"/>
<ExtendedTooltip name="ВидыЦенИсточникаНаименованиеРасширеннаяПодсказка" id="206"/>
</InputField>
<InputField name="ВидыЦенИсточникаВалютаКод" id="207">
<DataPath>Объект.ВидыЦенИсточника.ВалютаКод</DataPath>
<EditMode>EnterOnInput</EditMode>
<Width>8</Width>
<ContextMenu name="ВидыЦенИсточникаВалютаКодКонтекстноеМеню" id="208"/>
<ExtendedTooltip name="ВидыЦенИсточникаВалютаКодРасширеннаяПодсказка" id="209"/>
</InputField>
<CheckBoxField name="ВидыЦенИсточникаЦенаВключаетНДС" id="210">
<DataPath>Объект.ВидыЦенИсточника.ЦенаВключаетНДС</DataPath>
<EditMode>EnterOnInput</EditMode>
<Width>10</Width>
<CheckBoxType>Auto</CheckBoxType>
<ContextMenu name="ВидыЦенИсточникаЦенаВключаетНДСКонтекстноеМеню" id="211"/>
<ExtendedTooltip name="ВидыЦенИсточникаЦенаВключаетНДСРасширеннаяПодсказка" id="212"/>
</CheckBoxField>
<InputField name="ВидыЦенИсточникаСпособЗаданияЦены" id="213">
<DataPath>Объект.ВидыЦенИсточника.СпособЗаданияЦены</DataPath>
<EditMode>EnterOnInput</EditMode>
<Width>16</Width>
<ContextMenu name="ВидыЦенИсточникаСпособЗаданияЦеныКонтекстноеМеню" id="214"/>
<ExtendedTooltip name="ВидыЦенИсточникаСпособЗаданияЦеныРасширеннаяПодсказка" id="215"/>
</InputField>
<InputField name="ВидыЦенИсточникаВидЦены" id="216">
<DataPath>Объект.ВидыЦенИсточника.ВидЦены</DataPath>
<EditMode>EnterOnInput</EditMode>
<Width>20</Width>
<ContextMenu name="ВидыЦенИсточникаВидЦеныКонтекстноеМеню" id="217"/>
<ExtendedTooltip name="ВидыЦенИсточникаВидЦеныРасширеннаяПодсказка" id="218"/>
</InputField>
<InputField name="ВидыЦенИсточникаСтатусСопоставления" id="219">
<DataPath>Объект.ВидыЦенИсточника.СтатусСопоставления</DataPath>
<EditMode>EnterOnInput</EditMode>
<Width>14</Width>
<ContextMenu name="ВидыЦенИсточникаСтатусСопоставленияКонтекстноеМеню" id="220"/>
<ExtendedTooltip name="ВидыЦенИсточникаСтатусСопоставленияРасширеннаяПодсказка" id="221"/>
</InputField>
<InputField name="ВидыЦенИсточникаКомментарий" id="222">
<DataPath>Объект.ВидыЦенИсточника.Комментарий</DataPath>
<EditMode>EnterOnInput</EditMode>
<Width>24</Width>
<ContextMenu name="ВидыЦенИсточникаКомментарийКонтекстноеМеню" id="223"/>
<ExtendedTooltip name="ВидыЦенИсточникаКомментарийРасширеннаяПодсказка" id="224"/>
</InputField>
</ChildItems>
</Table>
</ChildItems>
</Page>
<Page name="ГруппаВходящиеЦены" id="24">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Входящие цены</v8:content>
</v8:item>
</Title>
<ExtendedTooltip name="ГруппаВходящиеЦеныРасширеннаяПодсказка" id="25"/>
<ChildItems>
<Table name="ВходящиеЦены" id="300">
<Representation>List</Representation>
<DataPath>Объект.ВходящиеЦены</DataPath>
<RowFilter xsi:nil="true"/>
<ContextMenu name="ВходящиеЦеныКонтекстноеМеню" id="301"/>
<AutoCommandBar name="ВходящиеЦеныКоманднаяПанель" id="302">
<ChildItems>
<Button name="ВходящиеЦеныЗагрузитьЦены" id="350">
<Type>CommandBarButton</Type>
<CommandName>Form.Command.ЗагрузитьЦены</CommandName>
<ExtendedTooltip name="ВходящиеЦеныЗагрузитьЦеныРасширеннаяПодсказка" id="351"/>
</Button>
<Button name="ВходящиеЦеныСопоставитьДанные" id="352">
<Type>CommandBarButton</Type>
<CommandName>Form.Command.СопоставитьДанные</CommandName>
<ExtendedTooltip name="ВходящиеЦеныСопоставитьДанныеРасширеннаяПодсказка" id="353"/>
</Button>
<Button name="ВходящиеЦеныСоздатьДокументы" id="354">
<Type>CommandBarButton</Type>
<CommandName>Form.Command.СоздатьДокументы</CommandName>
<ExtendedTooltip name="ВходящиеЦеныСоздатьДокументыРасширеннаяПодсказка" id="355"/>
</Button>
</ChildItems>
</AutoCommandBar>
<ExtendedTooltip name="ВходящиеЦеныРасширеннаяПодсказка" id="303"/>
<SearchStringAddition name="ВходящиеЦеныСтрокаПоиска" id="304">
<AdditionSource>
<Item>ВходящиеЦены</Item>
<Type>SearchStringRepresentation</Type>
</AdditionSource>
<ContextMenu name="ВходящиеЦеныСтрокаПоискаКонтекстноеМеню" id="305"/>
<ExtendedTooltip name="ВходящиеЦеныСтрокаПоискаРасширеннаяПодсказка" id="306"/>
</SearchStringAddition>
<ViewStatusAddition name="ВходящиеЦеныСостояниеПросмотра" id="307">
<AdditionSource>
<Item>ВходящиеЦены</Item>
<Type>ViewStatusRepresentation</Type>
</AdditionSource>
<ContextMenu name="ВходящиеЦеныСостояниеПросмотраКонтекстноеМеню" id="308"/>
<ExtendedTooltip name="ВходящиеЦеныСостояниеПросмотраРасширеннаяПодсказка" id="309"/>
</ViewStatusAddition>
<SearchControlAddition name="ВходящиеЦеныУправлениеПоиском" id="310">
<AdditionSource>
<Item>ВходящиеЦены</Item>
<Type>SearchControl</Type>
</AdditionSource>
<ContextMenu name="ВходящиеЦеныУправлениеПоискомКонтекстноеМеню" id="311"/>
<ExtendedTooltip name="ВходящиеЦеныУправлениеПоискомРасширеннаяПодсказка" id="312"/>
</SearchControlAddition>
<ChildItems>
<CheckBoxField name="ВходящиеЦеныСопоставлено" id="301">
<DataPath>Объект.ВходящиеЦены.Сопоставлено</DataPath>
<EditMode>EnterOnInput</EditMode>
<Width>8</Width>
<CheckBoxType>Auto</CheckBoxType>
<ContextMenu name="ВходящиеЦеныСопоставленоКонтекстноеМеню" id="302"/>
<ExtendedTooltip name="ВходящиеЦеныСопоставленоРасширеннаяПодсказка" id="303"/>
</CheckBoxField>
<InputField name="ВходящиеЦеныАртикул" id="304">
<DataPath>Объект.ВходящиеЦены.Артикул</DataPath>
<EditMode>EnterOnInput</EditMode>
<Width>12</Width>
<ContextMenu name="ВходящиеЦеныАртикулКонтекстноеМеню" id="305"/>
<ExtendedTooltip name="ВходящиеЦеныАртикулРасширеннаяПодсказка" id="306"/>
</InputField>
<InputField name="ВходящиеЦеныНоменклатураНаименование" id="307">
<DataPath>Объект.ВходящиеЦены.НоменклатураНаименование</DataPath>
<EditMode>EnterOnInput</EditMode>
<Width>22</Width>
<ContextMenu name="ВходящиеЦеныНоменклатураНаименованиеКонтекстноеМеню" id="308"/>
<ExtendedTooltip name="ВходящиеЦеныНоменклатураНаименованиеРасширеннаяПодсказка" id="309"/>
</InputField>
<InputField name="ВходящиеЦеныНоменклатура" id="310">
<DataPath>Объект.ВходящиеЦены.Номенклатура</DataPath>
<EditMode>EnterOnInput</EditMode>
<Width>20</Width>
<ContextMenu name="ВходящиеЦеныНоменклатураКонтекстноеМеню" id="311"/>
<ExtendedTooltip name="ВходящиеЦеныНоменклатураРасширеннаяПодсказка" id="312"/>
</InputField>
<InputField name="ВходящиеЦеныХарактеристикаНаименование" id="313">
<DataPath>Объект.ВходящиеЦены.ХарактеристикаНаименование</DataPath>
<EditMode>EnterOnInput</EditMode>
<Width>14</Width>
<ContextMenu name="ВходящиеЦеныХарактеристикаНаименованиеКонтекстноеМеню" id="314"/>
<ExtendedTooltip name="ВходящиеЦеныХарактеристикаНаименованиеРасширеннаяПодсказка" id="315"/>
</InputField>
<InputField name="ВходящиеЦеныВидЦеныНаименование" id="316">
<DataPath>Объект.ВходящиеЦены.ВидЦеныНаименование</DataPath>
<EditMode>EnterOnInput</EditMode>
<Width>16</Width>
<ContextMenu name="ВходящиеЦеныВидЦеныНаименованиеКонтекстноеМеню" id="317"/>
<ExtendedTooltip name="ВходящиеЦеныВидЦеныНаименованиеРасширеннаяПодсказка" id="318"/>
</InputField>
<InputField name="ВходящиеЦеныВидЦены" id="319">
<DataPath>Объект.ВходящиеЦены.ВидЦены</DataPath>
<EditMode>EnterOnInput</EditMode>
<Width>16</Width>
<ContextMenu name="ВходящиеЦеныВидЦеныКонтекстноеМеню" id="320"/>
<ExtendedTooltip name="ВходящиеЦеныВидЦеныРасширеннаяПодсказка" id="321"/>
</InputField>
<InputField name="ВходящиеЦеныЦена" id="322">
<DataPath>Объект.ВходящиеЦены.Цена</DataPath>
<EditMode>EnterOnInput</EditMode>
<Width>10</Width>
<ContextMenu name="ВходящиеЦеныЦенаКонтекстноеМеню" id="323"/>
<ExtendedTooltip name="ВходящиеЦеныЦенаРасширеннаяПодсказка" id="324"/>
</InputField>
<InputField name="ВходящиеЦеныТекущаяЦенаЦель" id="325">
<DataPath>Объект.ВходящиеЦены.ТекущаяЦенаЦель</DataPath>
<EditMode>EnterOnInput</EditMode>
<Width>10</Width>
<ContextMenu name="ВходящиеЦеныТекущаяЦенаЦельКонтекстноеМеню" id="326"/>
<ExtendedTooltip name="ВходящиеЦеныТекущаяЦенаЦельРасширеннаяПодсказка" id="327"/>
</InputField>
<InputField name="ВходящиеЦеныВалютаКод" id="328">
<DataPath>Объект.ВходящиеЦены.ВалютаКод</DataPath>
<EditMode>EnterOnInput</EditMode>
<Width>8</Width>
<ContextMenu name="ВходящиеЦеныВалютаКодКонтекстноеМеню" id="329"/>
<ExtendedTooltip name="ВходящиеЦеныВалютаКодРасширеннаяПодсказка" id="330"/>
</InputField>
<InputField name="ВходящиеЦеныИспользоватьСерииСклад" id="331">
<DataPath>Объект.ВходящиеЦены.ИспользоватьСерииСклад</DataPath>
<EditMode>EnterOnInput</EditMode>
<Width>12</Width>
<ContextMenu name="ВходящиеЦеныИспользоватьСерииСкладКонтекстноеМеню" id="332"/>
<ExtendedTooltip name="ВходящиеЦеныИспользоватьСерииСкладРасширеннаяПодсказка" id="333"/>
</InputField>
<InputField name="ВходящиеЦеныКлючЦенПоСерии" id="334">
<DataPath>Объект.ВходящиеЦены.КлючЦенПоСерии</DataPath>
<EditMode>EnterOnInput</EditMode>
<Width>14</Width>
<ContextMenu name="ВходящиеЦеныКлючЦенПоСерииКонтекстноеМеню" id="335"/>
<ExtendedTooltip name="ВходящиеЦеныКлючЦенПоСерииРасширеннаяПодсказка" id="336"/>
</InputField>
<InputField name="ВходящиеЦеныРазрывДетализации" id="337">
<DataPath>Объект.ВходящиеЦены.РазрывДетализации</DataPath>
<EditMode>EnterOnInput</EditMode>
<Width>24</Width>
<ContextMenu name="ВходящиеЦеныРазрывДетализацииКонтекстноеМеню" id="338"/>
<ExtendedTooltip name="ВходящиеЦеныРазрывДетализацииРасширеннаяПодсказка" id="339"/>
</InputField>
<InputField name="ВходящиеЦеныКомментарийСопоставления" id="340">
<DataPath>Объект.ВходящиеЦены.КомментарийСопоставления</DataPath>
<EditMode>EnterOnInput</EditMode>
<Width>24</Width>
<ContextMenu name="ВходящиеЦеныКомментарийСопоставленияКонтекстноеМеню" id="341"/>
<ExtendedTooltip name="ВходящиеЦеныКомментарийСопоставленияРасширеннаяПодсказка" id="342"/>
</InputField>
<CheckBoxField name="ВходящиеЦеныЗагруженоВДокумент" id="343">
<DataPath>Объект.ВходящиеЦены.ЗагруженоВДокумент</DataPath>
<EditMode>EnterOnInput</EditMode>
<Width>8</Width>
<CheckBoxType>Auto</CheckBoxType>
<ContextMenu name="ВходящиеЦеныЗагруженоВДокументКонтекстноеМеню" id="344"/>
<ExtendedTooltip name="ВходящиеЦеныЗагруженоВДокументРасширеннаяПодсказка" id="345"/>
</CheckBoxField>
</ChildItems>
</Table>
</ChildItems>
</Page>
<Page name="ГруппаСозданныеДокументы" id="26">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Документы установки</v8:content>
</v8:item>
</Title>
<ExtendedTooltip name="ГруппаСозданныеДокументыРасширеннаяПодсказка" id="27"/>
<ChildItems>
<Table name="СозданныеДокументы" id="400">
<Representation>List</Representation>
<DataPath>Объект.СозданныеДокументы</DataPath>
<RowFilter xsi:nil="true"/>
<ContextMenu name="СозданныеДокументыКонтекстноеМеню" id="401"/>
<AutoCommandBar name="СозданныеДокументыКоманднаяПанель" id="402">
<ChildItems>
</ChildItems>
</AutoCommandBar>
<ExtendedTooltip name="СозданныеДокументыРасширеннаяПодсказка" id="403"/>
<SearchStringAddition name="СозданныеДокументыСтрокаПоиска" id="404">
<AdditionSource>
<Item>СозданныеДокументы</Item>
<Type>SearchStringRepresentation</Type>
</AdditionSource>
<ContextMenu name="СозданныеДокументыСтрокаПоискаКонтекстноеМеню" id="405"/>
<ExtendedTooltip name="СозданныеДокументыСтрокаПоискаРасширеннаяПодсказка" id="406"/>
</SearchStringAddition>
<ViewStatusAddition name="СозданныеДокументыСостояниеПросмотра" id="407">
<AdditionSource>
<Item>СозданныеДокументы</Item>
<Type>ViewStatusRepresentation</Type>
</AdditionSource>
<ContextMenu name="СозданныеДокументыСостояниеПросмотраКонтекстноеМеню" id="408"/>
<ExtendedTooltip name="СозданныеДокументыСостояниеПросмотраРасширеннаяПодсказка" id="409"/>
</ViewStatusAddition>
<SearchControlAddition name="СозданныеДокументыУправлениеПоиском" id="410">
<AdditionSource>
<Item>СозданныеДокументы</Item>
<Type>SearchControl</Type>
</AdditionSource>
<ContextMenu name="СозданныеДокументыУправлениеПоискомКонтекстноеМеню" id="411"/>
<ExtendedTooltip name="СозданныеДокументыУправлениеПоискомРасширеннаяПодсказка" id="412"/>
</SearchControlAddition>
<ChildItems>
<InputField name="СозданныеДокументыДокументПредставление" id="401">
<DataPath>Объект.СозданныеДокументы.ДокументПредставление</DataPath>
<EditMode>EnterOnInput</EditMode>
<Width>30</Width>
<ContextMenu name="СозданныеДокументыДокументПредставлениеКонтекстноеМеню" id="402"/>
<ExtendedTooltip name="СозданныеДокументыДокументПредставлениеРасширеннаяПодсказка" id="403"/>
</InputField>
<InputField name="СозданныеДокументыВидЦены" id="404">
<DataPath>Объект.СозданныеДокументы.ВидЦены</DataPath>
<EditMode>EnterOnInput</EditMode>
<Width>20</Width>
<ContextMenu name="СозданныеДокументыВидЦеныКонтекстноеМеню" id="405"/>
<ExtendedTooltip name="СозданныеДокументыВидЦеныРасширеннаяПодсказка" id="406"/>
</InputField>
<InputField name="СозданныеДокументыКоличествоСтрок" id="407">
<DataPath>Объект.СозданныеДокументы.КоличествоСтрок</DataPath>
<EditMode>EnterOnInput</EditMode>
<Width>10</Width>
<ContextMenu name="СозданныеДокументыКоличествоСтрокКонтекстноеМеню" id="408"/>
<ExtendedTooltip name="СозданныеДокументыКоличествоСтрокРасширеннаяПодсказка" id="409"/>
</InputField>
<InputField name="СозданныеДокументыКомментарий" id="410">
<DataPath>Объект.СозданныеДокументы.Комментарий</DataPath>
<EditMode>EnterOnInput</EditMode>
<Width>30</Width>
<ContextMenu name="СозданныеДокументыКомментарийКонтекстноеМеню" id="411"/>
<ExtendedTooltip name="СозданныеДокументыКомментарийРасширеннаяПодсказка" id="412"/>
</InputField>
</ChildItems>
</Table>
</ChildItems>
</Page>
</ChildItems>
</Pages>
</ChildItems>
<Attributes>
<Attribute name="Объект" id="100001">
<Type>
<v8:Type>cfg:DataProcessorObject.РК_ЗагрузкаЦен</v8:Type>
</Type>
<MainAttribute>true</MainAttribute>
</Attribute>
<Attribute name="ПодключениеКСтороннейБазеПредыдущее" id="100002">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Подключение предыдущее</v8:content>
</v8:item>
</Title>
<Type>
<v8:Type>cfg:CatalogRef.РК_НастройкиПодключенияКВнешнейБазе</v8:Type>
</Type>
</Attribute>
</Attributes>
<Commands>
<Command name="ЗагрузитьВидыЦен" id="501">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Загрузить виды цен</v8:content>
</v8:item>
</Title>
<ToolTip/>
<Action>ЗагрузитьВидыЦен</Action>
<CurrentRowUse>Auto</CurrentRowUse>
</Command>
<Command name="ОтметитьВидыЦен" id="502">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Отметить</v8:content>
</v8:item>
</Title>
<ToolTip/>
<Action>ОтметитьВидыЦен</Action>
<CurrentRowUse>Auto</CurrentRowUse>
</Command>
<Command name="СнятьОтметкуВидовЦен" id="503">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Снять отметку</v8:content>
</v8:item>
</Title>
<ToolTip/>
<Action>СнятьОтметкуВидовЦен</Action>
<CurrentRowUse>Auto</CurrentRowUse>
</Command>
<Command name="СоздатьОтсутствующиеВидыЦен" id="504">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Создать отсутствующие виды цен</v8:content>
</v8:item>
</Title>
<ToolTip/>
<Action>СоздатьОтсутствующиеВидыЦен</Action>
<CurrentRowUse>Auto</CurrentRowUse>
</Command>
<Command name="ЗагрузитьЦены" id="505">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Загрузить цены</v8:content>
</v8:item>
</Title>
<ToolTip/>
<Action>ЗагрузитьЦены</Action>
<CurrentRowUse>Auto</CurrentRowUse>
</Command>
<Command name="СопоставитьДанные" id="506">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Сопоставить</v8:content>
</v8:item>
</Title>
<ToolTip/>
<Action>СопоставитьДанные</Action>
<CurrentRowUse>Auto</CurrentRowUse>
</Command>
<Command name="СоздатьДокументы" id="507">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Создать документы установки</v8:content>
</v8:item>
</Title>
<ToolTip/>
<Action>СоздатьДокументы</Action>
<CurrentRowUse>Auto</CurrentRowUse>
</Command>
</Commands>
</Form>
@@ -0,0 +1,327 @@
////////////////////////////////////////////////////////////////////////////////
// Форма обработки РК_ЗагрузкаЦен.
// https://git.p7net.ru/1c/crm3_26.rhana/issues/18
////////////////////////////////////////////////////////////////////////////////
#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Не ЗначениеЗаполнено(Объект.ПодключениеКСтороннейБазе) Тогда
Попытка
Объект.ПодключениеКСтороннейБазе = Константы.РК_РабочееПодключениеЧерезАПИ.Получить();
Исключение
КонецПопытки;
КонецЕсли;
ПодключениеКСтороннейБазеПредыдущее = Объект.ПодключениеКСтороннейБазе;
Если Не ЗначениеЗаполнено(Объект.ДатаЦен) Тогда
Объект.ДатаЦен = ТекущаяДатаСеанса();
КонецЕсли;
Если Не ЗначениеЗаполнено(Объект.ДатаДокументов) Тогда
Объект.ДатаДокументов = Объект.ДатаЦен;
КонецЕсли;
Если ПустаяСтрока(Объект.КомментарийДокументов) Тогда
Объект.КомментарийДокументов = "Перенос цен из crm3-dev";
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиКомандФормы
&НаКлиенте
Процедура ЗагрузитьВидыЦен(Команда)
Если Не ЗначениеЗаполнено(Объект.ПодключениеКСтороннейБазе) Тогда
ПоказатьПредупреждение(, "Укажите подключение к сторонней базе");
Возврат;
КонецЕсли;
Попытка
Текст = ЗагрузитьВидыЦенНаСервере();
Исключение
ПоказатьПредупреждение(, КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
Возврат;
КонецПопытки;
Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаВидыЦен;
ПоказатьОповещениеПользователя("Виды цен", , Текст);
КонецПроцедуры
&НаКлиенте
Процедура ОтметитьВидыЦен(Команда)
УстановитьОтметкуВыделенныхСтрок("ВидыЦенИсточника", Истина);
КонецПроцедуры
&НаКлиенте
Процедура СнятьОтметкуВидовЦен(Команда)
УстановитьОтметкуВыделенныхСтрок("ВидыЦенИсточника", Ложь);
КонецПроцедуры
&НаКлиенте
Процедура СоздатьОтсутствующиеВидыЦен(Команда)
Если Объект.ВидыЦенИсточника.Количество() = 0 Тогда
ПоказатьПредупреждение(, "Сначала загрузите виды цен");
Возврат;
КонецЕсли;
Описание = Новый ОписаниеОповещения("СоздатьОтсутствующиеВидыЦенПослеВопроса", ЭтотОбъект);
ПоказатьВопрос(Описание,
"Сопоставить виды цен и создать отсутствующие в целевой ИБ?" + Символы.ПС
+ "Да — запись; Нет — только проверка (тест); Отмена — прервать.",
РежимДиалогаВопрос.ДаНетОтмена);
КонецПроцедуры
&НаКлиенте
Процедура СоздатьОтсутствующиеВидыЦенПослеВопроса(РезультатВопроса, ДопПараметры) Экспорт
Если РезультатВопроса = КодВозвратаДиалога.Отмена Тогда
Возврат;
КонецЕсли;
РежимТест = (РезультатВопроса <> КодВозвратаДиалога.Да);
Попытка
Текст = СопоставитьВидыЦенНаСервере(РежимТест);
Исключение
ПоказатьПредупреждение(, КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
Возврат;
КонецПопытки;
ПоказатьОповещениеПользователя("Виды цен", , Текст);
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьЦены(Команда)
Если Не ЗначениеЗаполнено(Объект.ПодключениеКСтороннейБазе) Тогда
ПоказатьПредупреждение(, "Укажите подключение к сторонней базе");
Возврат;
КонецЕсли;
Если Не ЗначениеЗаполнено(Объект.ДатаЦен) Тогда
ПоказатьПредупреждение(, "Укажите дату среза цен");
Возврат;
КонецЕсли;
Попытка
Текст = ЗагрузитьЦеныНаСервере();
Исключение
ПоказатьПредупреждение(, КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
Возврат;
КонецПопытки;
Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаВходящиеЦены;
ПоказатьОповещениеПользователя("Входящие цены", , Текст);
КонецПроцедуры
&НаКлиенте
Процедура СопоставитьДанные(Команда)
Если Объект.ВходящиеЦены.Количество() = 0 Тогда
ПоказатьПредупреждение(, "Сначала загрузите цены");
Возврат;
КонецЕсли;
Попытка
Текст = СопоставитьЦеныНаСервере();
Исключение
ПоказатьПредупреждение(, КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
Возврат;
КонецПопытки;
ПоказатьОповещениеПользователя("Сопоставление", , Текст);
КонецПроцедуры
&НаКлиенте
Процедура СоздатьДокументы(Команда)
Если Не ЗначениеЗаполнено(Объект.ДатаДокументов) Тогда
ПоказатьПредупреждение(, "Укажите дату документов установки");
Возврат;
КонецЕсли;
Описание = Новый ОписаниеОповещения("СоздатьДокументыПослеВопроса", ЭтотОбъект);
ПоказатьВопрос(Описание,
"Создать и провести документы «Установка цен номенклатуры»?" + Символы.ПС
+ "Да — запись; Нет — только подсчёт (тест); Отмена — прервать.",
РежимДиалогаВопрос.ДаНетОтмена);
КонецПроцедуры
&НаКлиенте
Процедура СоздатьДокументыПослеВопроса(РезультатВопроса, ДопПараметры) Экспорт
Если РезультатВопроса = КодВозвратаДиалога.Отмена Тогда
Возврат;
КонецЕсли;
РежимТест = (РезультатВопроса <> КодВозвратаДиалога.Да);
Попытка
Текст = СоздатьДокументыНаСервере(РежимТест);
Исключение
ПоказатьПредупреждение(, КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
Возврат;
КонецПопытки;
Если Не РежимТест Тогда
Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаСозданныеДокументы;
КонецЕсли;
ПоказатьОповещениеПользователя("Документы установки", , Текст);
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
&НаКлиенте
Процедура УстановитьОтметкуВыделенныхСтрок(ИмяТаблицы, Отметка)
ТаблицаФормы = Элементы[ИмяТаблицы];
ДанныеТаблицы = Объект[ИмяТаблицы];
Выделенные = ТаблицаФормы.ВыделенныеСтроки;
Если Выделенные.Количество() = 0 Тогда
ПоказатьПредупреждение(, "Выделите строки в таблице");
Возврат;
КонецЕсли;
Для Каждого ИдентификаторСтроки Из Выделенные Цикл
СтрокаТЗ = ДанныеТаблицы.НайтиПоИдентификатору(ИдентификаторСтроки);
Если СтрокаТЗ <> Неопределено Тогда
СтрокаТЗ.Отметка = Отметка;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция ЗагрузитьВидыЦенНаСервере()
Ответ = РК_ОбменСВнешнейБазой.ВидыЦенВнешнейБазы(Объект.ПодключениеКСтороннейБазе);
ОбъектОбработки = РеквизитФормыВЗначение("Объект");
ОбъектОбработки.ЗаполнитьВидыЦенИзОтветаAPI(Ответ, Истина);
ТекстСопоставления = ОбъектОбработки.СопоставитьВидыЦен(Истина);
ЗначениеВРеквизитФормы(ОбъектОбработки, "Объект");
Возврат "Загружено " + Формат(Объект.ВидыЦенИсточника.Количество(), "ЧН=0; ЧГ=0")
+ ". " + ТекстСопоставления;
КонецФункции
&НаСервере
Функция СопоставитьВидыЦенНаСервере(РежимТест)
Объект.СоздаватьОтсутствующиеВидыЦен = Не РежимТест;
ОбъектОбработки = РеквизитФормыВЗначение("Объект");
Текст = ОбъектОбработки.СопоставитьВидыЦен(РежимТест);
ЗначениеВРеквизитФормы(ОбъектОбработки, "Объект");
Возврат Текст;
КонецФункции
&НаСервере
Функция ЗагрузитьЦеныНаСервере()
ВидыGUID = Новый Массив;
Для Каждого Стр Из Объект.ВидыЦенИсточника Цикл
Если Стр.Отметка И ЗначениеЗаполнено(Стр.Идентификатор) Тогда
ВидыGUID.Добавить(СокрЛП(Стр.Идентификатор));
КонецЕсли;
КонецЦикла;
Фильтры = Новый Структура;
Фильтры.Вставить("only_nonzero", Истина);
ПолныйОбход = Истина;
Если ВидыGUID.Количество() > 0 Тогда
Фильтры.Вставить("price_types", ВидыGUID);
ПолныйОбход = Ложь;
КонецЕсли;
ВсеСтроки = Новый Массив;
Курсор = "";
Лимит = 2000;
МаксСтраниц = 200;
Для НомерСтраницы = 1 По МаксСтраниц Цикл
ПараметрыЗапроса = Новый Структура;
ПараметрыЗапроса.Вставить("as_of", Формат(Объект.ДатаЦен, "ДФ=yyyy-MM-ddTHH:mm:ss"));
ПараметрыЗапроса.Вставить("limit", Лимит);
ПараметрыЗапроса.Вставить("filters", Фильтры);
Если ПолныйОбход Тогда
ПараметрыЗапроса.Вставить("allow_full_scan", Истина);
КонецЕсли;
Если Не ПустаяСтрока(Курсор) Тогда
ПараметрыЗапроса.Вставить("cursor", Курсор);
КонецЕсли;
Ответ = РК_ОбменСВнешнейБазой.ЦеныВнешнейБазы(Объект.ПодключениеКСтороннейБазе, ПараметрыЗапроса);
Строки = ЗначениеСвойстваОтвета(Ответ, "rows");
Если ТипЗнч(Строки) <> Тип("Массив") Тогда
ВызватьИсключение "Некорректный ответ /v1/prices/slice";
КонецЕсли;
Для Каждого СтрAPI Из Строки Цикл
ВсеСтроки.Добавить(СтрAPI);
КонецЦикла;
Мета = ЗначениеСвойстваОтвета(Ответ, "meta");
ЕстьЕще = Ложь;
Если ТипЗнч(Мета) = Тип("Структура") Или ТипЗнч(Мета) = Тип("Соответствие") Тогда
ЗначениеЕстьЕще = ЗначениеСвойстваОтвета(Мета, "has_more");
Если ТипЗнч(ЗначениеЕстьЕще) = Тип("Булево") Тогда
ЕстьЕще = ЗначениеЕстьЕще;
КонецЕсли;
КонецЕсли;
Курсор = СокрЛП(Строка(ЗначениеСвойстваОтвета(Ответ, "cursor")));
Если Не ЕстьЕще Или ПустаяСтрока(Курсор) Или Строки.Количество() = 0 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
ОбъектОбработки = РеквизитФормыВЗначение("Объект");
ОбъектОбработки.ЗаполнитьВходящиеЦеныИзОтветаAPI(Новый Структура("rows", ВсеСтроки), Истина);
ЗначениеВРеквизитФормы(ОбъектОбработки, "Объект");
Возврат "Загружено строк: " + Формат(Объект.ВходящиеЦены.Количество(), "ЧН=0; ЧГ=0");
КонецФункции
&НаСервере
Функция СопоставитьЦеныНаСервере()
ОбъектОбработки = РеквизитФормыВЗначение("Объект");
Текст = ОбъектОбработки.СопоставитьВходящиеЦены();
ЗначениеВРеквизитФормы(ОбъектОбработки, "Объект");
Возврат Текст;
КонецФункции
&НаСервере
Функция СоздатьДокументыНаСервере(РежимТест)
ОбъектОбработки = РеквизитФормыВЗначение("Объект");
Текст = ОбъектОбработки.СоздатьДокументыУстановкиЦен(РежимТест);
ЗначениеВРеквизитФормы(ОбъектОбработки, "Объект");
Возврат Текст;
КонецФункции
&НаСервере
Функция ЗначениеСвойстваОтвета(Источник, Имя)
Если Источник = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
Если ТипЗнч(Источник) = Тип("Структура") Или ТипЗнч(Источник) = Тип("ФиксированнаяСтруктура") Тогда
Значение = Неопределено;
Если Источник.Свойство(Имя, Значение) Тогда
Возврат Значение;
КонецЕсли;
Возврат Неопределено;
КонецЕсли;
Если ТипЗнч(Источник) = Тип("Соответствие") Или ТипЗнч(Источник) = Тип("ФиксированноеСоответствие") Тогда
Возврат Источник.Получить(Имя);
КонецЕсли;
Возврат Неопределено;
КонецФункции
#КонецОбласти