Доброго времени суток. Пишу правило выгрузки через КД, рарус в бп 2.0. Но возникла проблема сдвумя справочниками, Ставки НДС(частично уже решил) И ХозОперации. Конвертация происходит СПР = Перечисления. Подскажите как лучше это произвести. Что бы выгружалось все эдентично.
Если Источник.Предопределенный Тогда
ИмяПКО = "СтавкиНДС";
ИначеЕсли Источник.Ставка = 10 Тогда // или как тут можно однозначно идентифицировать значение ставки
Значение = "НДС10";
КонецЕсли;
Совет в (4) можно использовать и в обратную сторону (в качестве "Значение" использовать поисковый реквизит справочника (например наименование). В этом случае надо будет передавать значение через ВходящиеДанные.
Если со ставками разобрался, то по ХозОперациям вижу два варианта: или по наименованию искать (тогда придется строго соблюдать идентичность наименований и ограничить ввод новых ХозОпераций только одной базой) либо по коду сопоставлять (справедливо правило как и для наименований). Еще можно создать РС в одной из баз и в ней хранить соответствие кодов или наименований элементов обеих баз, а в правилах, при выгрузке или загрузке, в зав-ти от того где расположен регистр, осуществлять по нему поиск нужного элемента. РС придется заполнять руками и при появлении новых элементов дополнять. Или, ограничив ввод новых элементов в одной из баз, при обмене добавляя новый элемент, тут же писать соответствие в РС, на случай если все-таки ручками что-то подправят. Но первичное сопоставление в РС все равно руками.
Если я правильно понял вопрос, то надо значения перечисления перенести в справочник.
В этом случае можно создать правило конвертации объектов "Перечисление" -> "Справочник" и воспользоваться закладкой "Конвертация значений". Там можно указать какое значение перечисления будет соответствовать какому значению справочника.
Вроде все.
(11) Ничего пока лучшего не придумали. У меня так для Справочник (УПП 1.3) -> Перечисление (77 комплексная)
Источник_Строка = СокрЛП(Источник.РаботникиОрганизации.Получить(0).СтатьяТКРФ);//это по сути ссылка справочник.
Если Найти(Источник_Строка,"Соглашение сторон, статья 78 Трудового кодекса Российской Федерации") > 0 Тогда
Значение = "СоглашениеСторон";
ИначеЕсли Найти(Источник_Строка,"Истечение срока трудового договора, статья 58 Трудового кодекса Российской Федерации, пункт 2") > 0
или Найти(Источник_Строка,"п. 2 ст. 77 ТК. Истечение срока трудового договора") > 0 Тогда
Значение = "ОкончаниеДоговора";
ИначеЕсли Найти(Источник_Строка,"Увольнение по собственному желанию пункт 3 части первой статьи 77 Трудового кодекса Российской Федерации") > 0
или Найти(Источник_Строка,"п. 3 ст. 77 ТК. Расторжение трудового договора по инициативе работника") > 0 Тогда // для выгрузки из 77 в УПП. Времено. Потом слить.
Значение = "ПоСобственномуЖеланию";
ИначеЕсли Найти(Источник_Строка,"Увольнение в связи с признанием работника полностью нетрудоспособным, пункт 5 статьи 81 Трудового кодекса Российской Федерации") > 0 Тогда
Значение = "ПолнаяНетрудоспособность";
ИначеЕсли Найти(Источник_Строка,"Увольнение в связи со смертью, пункт 6 части первой статьи 83 Трудового кодекса Российской Федерации") > 0
или Найти(Источник_Строка,"п. 6 ст.83 ТК. Смерть работника либо работодателя - физ. лица, а также признание судом работника либо работодателя - физ. лица умершим") > 0 Тогда
Значение = "Смерть";
Иначе
Значение = "";
КонецЕсли;
Показать
Если это Вам так не нравиться ))), то можно свой узел создать типа (Это только при выгрузке. При загрузке тоже надо кодить.):
ЗначениеСтатуса_Источник = Параметры.ЗначениеСтатуса_Источник;
ЗначениеСтатуса_Приемник = Параметры.ЗначениеСтатуса_Приемник;
УзелПарам=СоздатьУзел("ЗначениеСтатуса");
УстановитьАтрибут(УзелПарам,"Имя","СтатусПроведения");
УстановитьАтрибут(УзелПарам,"Тип","Строка");
Если ЗначениеСтатуса_Источник.Проведен тогда
Статус = "Проведен";
Иначе
Статус = "НеПроведен";
КонецЕсли;
одЗаписатьЭлемент(УзелПарам,"Значение",Статус);
ДобавитьПодчиненный(ЗначениеСтатуса_Приемник, УзелПарам);
(11) PhoenixAOD,
Если на момент написания правил обмена справочник заполнен, то "Конвертация значений" тоже подойдет, если значений еще нет, или надо реализовать какой-либо алгоритм переноса значений справочника в значения перечисления, то реализуем алгоритм и в конце алгоритма пишем как в
(4)
Значение = "ИмяЭлементаПеречисленияКакОноЗаданоВКонфигураторе"
А сам алгоритм располагаем в обработчике события "При выгрузке" в правиле конвертации свойств.
Система сама подставляет указанное значение перечисления (т.е. она в xml хранит указанный идентификатор и при загрузке ищет значение перечисления по этому идентификатору)
(13) 1cmailru, так то оно так, но вот почемуто БезНДС и НДС18, заполняется, а вот НДС10 пустое значение в Бухии. И в чем проблема не могу понять(( Причем при выполнении алгоритма как написал rgrisha, возникает таже се сама ошибка при выгрузке: "Не найдено соотвествие значения для Источника", Именно на 10% НДС ругается.
(15) PhoenixAOD, Значит надо внимательно посмотреть как написано "НДС10" в имени значения перечисления и в коде
Значение = "НДС10";
Тут или синтакситечская ошибка (типа "НДС10" и "Н ДС10"), или может быть в алгоритме Значение так остается неопределено.
// Попробуйте после
конецесли;
// написать чтото типа
Сообщить("Знач="+Значение);
С хоз операциями разобрался, а вот с НДС 10% запара, 18 и БезНДС сдела по предопределенным, там все пучком пошло, а вот 10 это не предопредленный элемент справочника, и он ни в какую не хочет выгружаться((( Че делать ума не приложу. Перепробовал все варианты, что были: От сюда http://www.softmaker.kz/articles/1s/konvertaciya-dannyx-1c-pravila-konvertacii-gruppy-svojstv-pkgs.html, и Бояркина перелопатил, не накает и все тут хоть ты тресни((
В конвертации есть типовой пример Число в Перечисление.
В правиле конвертации свойств в процедуре перед выгрузкой есть код
Если Источник.СкидкаДляДистрибьютора = 30 Тогда
Значение = "Скидка30";
КонецЕсли;
Согласно ему Значение приравнивается к имени перечисления приемника, следовательно тебе необходимо оформить свои условия конвертации, для универсальности я бы сделал так
значение = стрЗаменить(стрзаменить(источник.Наименование," ",""),"%","");
только все таки предется придерживаться правил написания наименований ставок НДС
Хотя нет, вижу что НДС 10 не предопределенный элемент. В таком случае наверное лучше разделить ПКО ставок ндс на 2, в одном переносить предопределенные (конвертацией значений), в другом непредопределенные
Возвращаюсь опять к Вам Уважаемые, перепробовал вообще варианты, так же стоит острый вопрос в переносе НДС10, в источнике справочник Наименование 10%, значение число 10,00, в приемнике это пеерчисление наименование НДС10, синоним 10%, На 2 других БезНДС и НДС18% все без нареканий они предопределенные, а НДС10 не предопределенный в источнике.
Скрины бы с настройками правил конвертации объектов
Интересует: по каким полям идёт поиск объекта
есть ли какой код в обработчиках "перед выгрузкой" и других объекта?
и в качестве безумного совета: а не сделать ли в источнике ндс10 тоже предопределённым значением?
П(28) baldorc, проверял, значение пустое получается. Ваще не понимаю че за беда((( Другие спр нормально выгружаются, замещают найденные элементы, на то что нужно, ХозОперации идут как надо, а вот эти 10% убивают на повал просто(((
Если Источник.Ставка = 10 Тогда
значение = "НДС10";
Иначе
значение = "НДС10";
КонецЕсли;
вне зависимости от ставки в справочнике-источнике ставка должна выгрузиться "НДС10"
а если попробовать так:
Если Источник.Ставка = 18 Тогда
значение = "НДС18";
ИначеЕсли Источник.Ставка = 10 Тогда
значение = "НДС10";
ИначеЕсли Источник.Ставка = 0 Тогда
значение = "БезНДС";
Иначе
значение = "НДС18";
КонецЕсли;
Показать
и опять посмотреть что выгрузится
также стоит попробовать в конвертации значений добавить конвертацию пустого значения источника в НДС10, хотя это бред :)
тогда ситуация проясняется:
конвертация не понимает что такое "НДС10" и "НДС18" тоже ей незнакомо.
Можно попробовать вместо "НДС10" написать что-то типа "Перечисления.СтавкиНДС.НДС10"
и тоже самое вместо НДС18 и БезНДС
Как вообще конвертируется Справочник в Перечисление? Через ПКО? Если так, то скриншоты ПКО для СтавкаНДС (Справочник -> Перечисление) можно увидеть? Иначе не понятно вообще.
(49) Пиши как в (50) указали, в каждом правиле конвертации свойств, касающемся ставки НДС пиши "Если ... Значение = "НДС..."
Это надо будет сделать в каждом ПКО для данных ПКС.
По другому вряд ли получится.
Почему-то в типовых правилах для планов счетов разделяются ПКО для предопределенных значений, и для остальных счетов (и соответсвенно в ПКС прописывается Если ... ИмяПКО = "ПланСчетоПредопределенный" или ИмяПКО = ...")
Вообще при конвертации справочника в перечисление есть 3 способа.
1. Передать значение перечисления в правиле конвертации свойства (СтавкаНДС -> СтавкаНДС).
Пример:
Значение = "БезНДС";
2. Тоже, что и выше, но вместо значения использовать выражение.
Пример:
Выражение = "Перечисления.СтавкиНДС.БезНДС";
3. Через ПКО.
А у тебя точно в источник нет предопределенного значения Ставка НДС 10 ? Сделай для отладки вывод сообщения при выгрузке ставок НДС : Сообщить("Предопределенны" + Источник.Предопределенный) (это в событии "ПередВыгрузкой" для ПКО СтавкиНДС)
Хотя если будешь писать в ПКС Значение = "НДС10", то возможно "ПередВыгрузкой", для ПКО СтавкиНДС и не отработает (проверить сейчас не могу). И кажется, если будешь писать в ПКС, то в нем не надо указывать ПКО
И вообще, пожалуй, проще сделать ставку НДС 10 предопределенной (добавить предопределенную ставку, и заменить на нее непредопредеелнную, на ИТС есть обработки по замене)
(59) adva, а вот что проще вообще не согласен, база большая, 131000 позиций, документов приходов только в день делается около 250, не считая Z-отчетов и тд
Чтобы посмотреть, где есть ссылки на ПКО Ставки НДС, встань на них, и выбери "Действия - Показать ссылки на ПКО". И во всех этих местах и надо будет исправить
(79) какое правило перестало работать? Если ты убрал ссылку на ПКО, и указал Значение = "НДС10", то правило вроде и не должно отрабатывать. А при загрузке грузится хоть? Ты много не грузи, делай отборы по номенклатуре, чтобы быстрее можно было проверять
Если Источник.Предопределенный Тогда
ИмяПКО = "СтавкиНДС";
ИначеЕсли Источник.Ставка = 10 Тогда // или как тут можно однозначно идентифицировать значение ставки
Значение = "НДС10";
КонецЕсли;
Ставка = Источник.СтавкаНДС;
Если Ставка = 0 Тогда
Значение = "БезНДС";
ИначеЕсли Ставка = 18 Тогда
Значение = "НДС18";
ИначеЕсли Ставка = 10 Тогда
Выражение = Строка("Перечисление.СтавкиНДС.НДС10");