При копировании номенклатуры не копируются имеющиеся спецификации
Здравствуйте! Помогите пожалуйста в одном очень важном вопросе. При копировании номенклатуры не копируются имеющиеся в ней спецификации, испробовал разные варианты исправления кода, не помогает.
Процедура Расш_ПередЗаписью(Отказ, ПараметрыЗаписи)
Если ПараметрыЗаписи.РежимЗаписи = РежимЗаписи.Добавление Тогда
// Получаем объект текущего элемента номенклатуры
ТекущийЭлемент = ЭтотОбъект.ТекущийЭлемент();
// Вызываем процедуру копирования
Расш_КопироватьСпецификации(ТекущийЭлемент);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Расш_ПослеЗаписи(Отказ, ПараметрыЗаписи)
Если ПараметрыЗаписи.РежимЗаписи = РежимЗаписи.Добавление Тогда
// Получаем объект текущего элемента номенклатуры
ТекущийЭлемент = ЭтотОбъект.ТекущийЭлемент();
// Вызываем процедуру копирования
Расш_КопироватьСпецификации(ТекущийЭлемент);
КонецЕсли;
КонецПроцедуры
Процедура Расш_КопироватьСпецификации(НоваяНоменклатура)
// Проверяем, есть ли у исходной номенклатуры спецификации
Если НоваяНоменклатура.Спефикации.Количество() > 0 Тогда
// Цикл по спецификациям исходной номенклатуры
Для Каждого Спецификация Из НоваяНоменклатура.Спефикации Цикл
// Создаем новую спецификацию в новой номенклатуре
НоваяСпецификация = НоваяНоменклатура.Спефикации.Создать("Новый элемент");
// Копируем данные из исходной спецификации
НоваяСпецификация.Номенклатура = Спецификация.Номенклатура;
НоваяСпецификация.Количество = Спецификация.Количество;
НоваяСпецификация.Цена = Спецификация.Цена;
// Дополнительно: скопировать другие свойства спецификации, если нужно
// Например: НоваяСпецификация.ЕдиницаИзмерения = Спецификация.ЕдиницаИзмерения;
// Записываем новую спецификацию
НоваяСпецификация.Записать();
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Синтаксических ошибок нет. Версия 1С Бухгалтерия 3.0
Процедура Расш_ПередЗаписью(Отказ, ПараметрыЗаписи)
Если ПараметрыЗаписи.РежимЗаписи = РежимЗаписи.Добавление Тогда
// Получаем объект текущего элемента номенклатуры
ТекущийЭлемент = ЭтотОбъект.ТекущийЭлемент();
// Вызываем процедуру копирования
Расш_КопироватьСпецификации(ТекущийЭлемент);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Расш_ПослеЗаписи(Отказ, ПараметрыЗаписи)
Если ПараметрыЗаписи.РежимЗаписи = РежимЗаписи.Добавление Тогда
// Получаем объект текущего элемента номенклатуры
ТекущийЭлемент = ЭтотОбъект.ТекущийЭлемент();
// Вызываем процедуру копирования
Расш_КопироватьСпецификации(ТекущийЭлемент);
КонецЕсли;
КонецПроцедуры
Процедура Расш_КопироватьСпецификации(НоваяНоменклатура)
// Проверяем, есть ли у исходной номенклатуры спецификации
Если НоваяНоменклатура.Спефикации.Количество() > 0 Тогда
// Цикл по спецификациям исходной номенклатуры
Для Каждого Спецификация Из НоваяНоменклатура.Спефикации Цикл
// Создаем новую спецификацию в новой номенклатуре
НоваяСпецификация = НоваяНоменклатура.Спефикации.Создать("Новый элемент");
// Копируем данные из исходной спецификации
НоваяСпецификация.Номенклатура = Спецификация.Номенклатура;
НоваяСпецификация.Количество = Спецификация.Количество;
НоваяСпецификация.Цена = Спецификация.Цена;
// Дополнительно: скопировать другие свойства спецификации, если нужно
// Например: НоваяСпецификация.ЕдиницаИзмерения = Спецификация.ЕдиницаИзмерения;
// Записываем новую спецификацию
НоваяСпецификация.Записать();
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Синтаксических ошибок нет. Версия 1С Бухгалтерия 3.0
Прикрепленные файлы:
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Это было бы очень смешно, если не было бы ... еще смешнее. Копировать связанные объекты?
Про использование "ПередЗаписью" уже даже как-то неудобно вспоминать...
Вот откуда? Откуда такие уникумы появляются???
не копируются имеющиеся в ней спецификации
А должны? С чего вдруг?
испробовал разные варианты исправления кода
А код требовал исправления? Он был с ошибками? Или его не было, и ты решил сбоку наговнокодить в своем расширении?
Если НоваяНоменклатура.Спефикации.Количество()
И ведь не смущает, что у Номенклатуры нет табличной части Спецификации!
НоваяНоменклатура.Спефикации.Создать("Новый элемент")
Тут я долго могу придумывать комментарий, но ничего не смогу придумать. Ибо рыдаю, слезы глаза застят...
Про использование "ПередЗаписью" уже даже как-то неудобно вспоминать...
Вот откуда? Откуда такие уникумы появляются???
Вот тут пример навскидку написал для основной спецификации (отвлекаясь от постановки задачи вообще — решить её можно по-разному, в том числе и с помощью отдельной команды / внешней обработки, которая бы могла, например, выполнять некую массовую и регулярную рутину). То, что у топикстартера это, конечно, нечто непонятное.
На форме элемента надо создать реквизит ЗначениеКопирования типа Справочник Номенклатура.
На форме элемента надо создать реквизит ЗначениеКопирования типа Справочник Номенклатура.
// Форма элемента
&НаСервере
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
ЭтотОбъект.ЗначениеКопирования = Параметры.ЗначениеКопирования;
КонецПроцедуры
&НаСервере
Процедура Расш1_ПередЗаписьюНаСервереПосле(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Если Объект.Ссылка.Пустая() И Не ЭтотОбъект.ЗначениеКопирования.Пустая() Тогда
ТекущийОбъект.ДополнительныеСвойства.Вставить("ЗначениеКопирования", ЗначениеКопирования);
СпецификацииНоменклатурыНоваяСсылка = Справочники.СпецификацииНоменклатуры.ПолучитьСсылку(Новый УникальныйИдентификатор());
ТекущийОбъект.ДополнительныеСвойства.Вставить("СпецификацииНоменклатурыНоваяСсылка", СпецификацииНоменклатурыНоваяСсылка);
ТекущийОбъект.ОсновнаяСпецификацияНоменклатуры = СпецификацииНоменклатурыНоваяСсылка;
КонецЕсли;
КонецПроцедуры
// Модуль объекта
&После("ПриЗаписи")
Процедура Расш1_ПриЗаписи(Отказ)
Если ЭтотОбъект.ДополнительныеСвойства.Свойство("ЗначениеКопирования") Тогда
ИскомаяСпецификация = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ЭтотОбъект.ДополнительныеСвойства.ЗначениеКопирования, "ОсновнаяСпецификацияНоменклатуры");
Если ЗначениеЗаполнено(ИскомаяСпецификация) Тогда
Расш1_СкопироватьСпецификацию(ИскомаяСпецификация);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура Расш1_СкопироватьСпецификацию(ИскомаяСпецификация)
НовОбт = ИскомаяСпецификация.Скопировать();
НовОбт.УстановитьСсылкуНового(ЭтотОбъект.ДополнительныеСвойства.СпецификацииНоменклатурыНоваяСсылка);
НовОбт.Владелец = ЭтотОбъект.Ссылка;
НовОбт.Записать();
КонецПроцедуры
Показать
Пжжи. Вот, во-первых, новый код. Тут копируются все спеки.
Во-вторых, один код вставляется в форму элемента, другой - в модуль объекта. Ну а так — у меня типовая свежая БП 3. Не знаю, что у тебя.
Это в форму элемента:
Это в модуль объекта:
И проверь, чтобы обработчики событий в палитре свойств привязаны были.
P.S. Если у тебя локализация для другой страны или доработанная конфа, это уже другой вопрос. Собственно, информации уже достаточно.
Во-вторых, один код вставляется в форму элемента, другой - в модуль объекта. Ну а так — у меня типовая свежая БП 3. Не знаю, что у тебя.
Это в форму элемента:
&НаСервере
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
ЭтотОбъект.ЗначениеКопирования = Параметры.ЗначениеКопирования;
КонецПроцедуры
&НаСервере
Процедура Расш1_ПередЗаписьюНаСервереПосле(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Если Объект.Ссылка.Пустая() И Не ЭтотОбъект.ЗначениеКопирования.Пустая() Тогда
ТекущийОбъект.ДополнительныеСвойства.Вставить("ЗначениеКопирования", ЗначениеКопирования);
ЗначениеКопированияОсновнаяСпецификация = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ЗначениеКопирования, "ОсновнаяСпецификацияНоменклатуры");
Если Не ЗначениеКопированияОсновнаяСпецификация.Пустая() Тогда
СпецификацииНоменклатурыНоваяСсылка = Справочники.СпецификацииНоменклатуры.ПолучитьСсылку(Новый УникальныйИдентификатор());
ТекущийОбъект.ДополнительныеСвойства.Вставить("СпецификацииНоменклатурыНоваяСсылка", СпецификацииНоменклатурыНоваяСсылка);
ТекущийОбъект.ОсновнаяСпецификацияНоменклатуры = СпецификацииНоменклатурыНоваяСсылка;
ТекущийОбъект.ДополнительныеСвойства.Вставить("ЗначениеКопированияОсновнаяСпецификация", ЗначениеКопированияОсновнаяСпецификация);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
ПоказатьЭто в модуль объекта:
&После("ПриЗаписи")
Процедура Расш1_ПриЗаписи(Отказ)
Если ЭтотОбъект.ДополнительныеСвойства.Свойство("ЗначениеКопирования") Тогда
Расш1_СкопироватьСпецификации();
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура Расш1_СкопироватьСпецификации()
Запрос = Новый Запрос();
Запрос.УстановитьПараметр("Владелец", ЭтотОбъект.ДополнительныеСвойства.ЗначениеКопирования);
Запрос.Текст =
"ВЫБРАТЬ
| Таблица.Ссылка КАК Ссылка
|ИЗ
| Справочник.СпецификацииНоменклатуры КАК Таблица
|ГДЕ
| Таблица.Владелец = &Владелец";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
НовОбт = Выборка.Ссылка.Скопировать();
НовОбт.Владелец = ЭтотОбъект.Ссылка;
Если ЭтотОбъект.ДополнительныеСвойства.Свойство("ЗначениеКопированияОсновнаяСпецификация") Тогда
Если Выборка.Ссылка = ЭтотОбъект.ДополнительныеСвойства.ЗначениеКопированияОсновнаяСпецификация Тогда
НовОбт.УстановитьСсылкуНового(ЭтотОбъект.ДополнительныеСвойства.СпецификацииНоменклатурыНоваяСсылка);
КонецЕсли;
КонецЕсли;
НовОбт.Записать();
КонецЦикла;
КонецПроцедуры
ПоказатьИ проверь, чтобы обработчики событий в палитре свойств привязаны были.
P.S. Если у тебя локализация для другой страны или доработанная конфа, это уже другой вопрос. Собственно, информации уже достаточно.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот