Код обработки автоматического создания объекта в справочнике
Здравствуйте уважаемые программисты. Это код для того, чтобы в БП 3.0 создавать договоры по имени клиента, если у него отсутствует договор. В БП информация ежедневно загружается из УТ. Поэтому и есть необходимость в такой обработке. Код запускается в БП 3.0
Суть проблемы: Если код создания объекта в цикле, то обработка вообще не работает, а если вытащить её из цикла, то пишет, что невозможно записать, так как не указан контрагент или указан неверно.
Прошу помочь.
P.S. ВидДоговора - это перечисление
Суть проблемы: Если код создания объекта в цикле, то обработка вообще не работает, а если вытащить её из цикла, то пишет, что невозможно записать, так как не указан контрагент или указан неверно.
Прошу помочь.
&НаСервере
Процедура ОтборДоговораНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СчетНаОплатуПокупателю.Ссылка КАК Ссылка,
| СчетНаОплатуПокупателю.ДоговорКонтрагента КАК ДоговорКонтрагента,
| СчетНаОплатуПокупателю.Контрагент.код КАК Контрагент,
| СчетНаОплатуПокупателю.Контрагент.Наименование КАК КонтрагентНаименование,
| СчетНаОплатуПокупателю.Организация КАК Организация
|ИЗ
| Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю
|ГДЕ
| СчетНаОплатуПокупателю.ДоговорКонтрагента = НЕОПРЕДЕЛЕНО";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.следующий() Цикл
НовыйЭлемент = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();
НовыйЭлемент.Наименование = ВыборкаДетальныеЗаписи.КонтрагентНаименование;
НовыйЭлемент.Владелец = ВыборкаДетальныеЗаписи.Контрагент;
//НовыйЭлемент.Контрагент = ВыборкаДетальныеЗаписи.Контрагент;
НовыйЭлемент.ВидДоговора = "С Покупателем";
НовыйЭлемент.Организация = ВыборкаДетальныеЗаписи.Организация;
НовыйЭлемент.Записать();
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ОтборДоговора(Команда)
ОтборДоговораНаСервере();
КонецПроцедуры
ПоказатьP.S. ВидДоговора - это перечисление
По теме из базы знаний
- Внутренности объектов (справочников, документов)
- Подсистема "Акцизные марки" для УТ 11.2 и Розница 2.2
- Универсальная обработка получения ссылок по УИД, УИД по ссылкам, создания объектов с указанным УИД, поиск соответствия, настройка нового соответствия (УФ и обычные формы) v.2
- Рисуем Робота в диаграмме Ганта с использованием Регистра расчетов и Плана видов расчета
- Автоматическое создание сотрудников и пользователей в 1С:Документооборот 3
Найденные решения
(1)Начнем с того, что Вы повелись на псевдоним Владельца. Правой кнопкой выбираем Стандартные реквизиты. Там Владелец обозначен Контрагент. И код Владельцу присваивать совершенно не уместно. В счет фактуре договор это
В общем запрос для создания договора должен выглядеть так
Заметьте. Я получаю свойства нового договора прямо в запросе, чтобы потом написать
ПредопределенноеЗначение("Справочник.ДоговорыКонтрагентов.ПустаяСсылка")
В общем запрос для создания договора должен выглядеть так
Запрос.Текст =
"ВЫБРАТЬ
| СчетНаОплатуПокупателю.Контрагент КАК Владелец
| СчетНаОплатуПокупателю.Контрагент.Наименование КАК Наименование,
| СчетНаОплатуПокупателю.Организация КАК Организация
|ИЗ
| Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю
|ГДЕ
| НЕ СчетНаОплатуПокупателю.ДоговорКонтрагента = ЗНАЧЕНИЕ(Справочник.ДоговорыКонтрагентов.ПустаяСсылка)";
ПоказатьЗаметьте. Я получаю свойства нового договора прямо в запросе, чтобы потом написать
ЗаполнитьЗначенияСвойств(НовыйЭлемент , ВыборкаДетальныеЗаписи);
НовыйЭлемент .Записать();
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)Начнем с того, что Вы повелись на псевдоним Владельца. Правой кнопкой выбираем Стандартные реквизиты. Там Владелец обозначен Контрагент. И код Владельцу присваивать совершенно не уместно. В счет фактуре договор это
В общем запрос для создания договора должен выглядеть так
Заметьте. Я получаю свойства нового договора прямо в запросе, чтобы потом написать
ПредопределенноеЗначение("Справочник.ДоговорыКонтрагентов.ПустаяСсылка")
В общем запрос для создания договора должен выглядеть так
Запрос.Текст =
"ВЫБРАТЬ
| СчетНаОплатуПокупателю.Контрагент КАК Владелец
| СчетНаОплатуПокупателю.Контрагент.Наименование КАК Наименование,
| СчетНаОплатуПокупателю.Организация КАК Организация
|ИЗ
| Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю
|ГДЕ
| НЕ СчетНаОплатуПокупателю.ДоговорКонтрагента = ЗНАЧЕНИЕ(Справочник.ДоговорыКонтрагентов.ПустаяСсылка)";
ПоказатьЗаметьте. Я получаю свойства нового договора прямо в запросе, чтобы потом написать
ЗаполнитьЗначенияСвойств(НовыйЭлемент , ВыборкаДетальныеЗаписи);
НовыйЭлемент .Записать();
(2)
Благодарю за помощь! Огромное спасибо.
Получился такой код:
но выдаёт такую ошибку:
{ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(15)}: Ошибка при вызове метода контекста (Выполнить)
РезультатЗапроса = Запрос.Выполнить();
по причине:
{(5, 10)}: Неверные параметры "Перечисление.ВидыДоговоров.СПокупателем"
Значение(<<?>>Перечисление.ВидыДоговоров.СПокупателем) как ВидДоговора
ра прямо в запросе, чтобы потом на
Благодарю за помощь! Огромное спасибо.
Получился такой код:
&НаСервере
Процедура ОтборДоговораНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СчетНаОплатуПокупателю.Контрагент КАК Владелец,
| СчетНаОплатуПокупателю.Контрагент.Наименование КАК Наименование,
| СчетНаОплатуПокупателю.Организация КАК Организация,
| Значение(Перечисление.ВидыДоговоров.СПокупателем) как ВидДоговора
|ИЗ
| Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю
|ГДЕ
| НЕ СчетНаОплатуПокупателю.ДоговорКонтрагента = ЗНАЧЕНИЕ(Справочник.ДоговорыКонтрагентов.ПустаяСсылка)";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.следующий() Цикл
НовыйЭлемент = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();
ЗаполнитьЗначенияСвойств(НовыйЭлемент , ВыборкаДетальныеЗаписи);
НовыйЭлемент .Записать();
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ОтборДоговора(Команда)
ОтборДоговораНаСервере();
КонецПроцедуры
Показатьно выдаёт такую ошибку:
{ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(15)}: Ошибка при вызове метода контекста (Выполнить)
РезультатЗапроса = Запрос.Выполнить();
по причине:
{(5, 10)}: Неверные параметры "Перечисление.ВидыДоговоров.СПокупателем"
Значение(<<?>>Перечисление.ВидыДоговоров.СПокупателем) как ВидДоговора
(6)Это Вы поторопились. Надо думать, а не исполнять сразу.1С конфиг много, мегет быть все по разному Смотрите в свойства.как на рисунке.
Так и должно обзываться в запросе. Единственное ПречислениеСсылка Ссылка лишнее слово. Будет ругаться
Я просто Вам показывал Ваши ошибки и путь решения. Остальное Вы сами:)
Так и должно обзываться в запросе. Единственное Пречисление
Я просто Вам показывал Ваши ошибки и путь решения. Остальное Вы сами:)
Прикрепленные файлы:
(7)Зырим в свойства договора в пофигураторе. В запросе назначаем псевдонимы те же(после КАК)
И штатный метод ЗаполнитьЗначенияСвойств схавает и за ушами трещать будет:)
Главное не обманывать типа:
То молча будет пусто.
А подставишь свойство с нужным типом правильно. Все будет ОК
И штатный метод ЗаполнитьЗначенияСвойств схавает и за ушами трещать будет:)
Главное не обманывать типа:
Владелец = Контрагент.код
То молча будет пусто.
А подставишь свойство с нужным типом правильно. Все будет ОК
(13)
Теперь я Вас не понимаю. Можно как то в скринах. И код студию, ато висят на дубе две вишенки, особенно вторая.Тут все просто. Вопрос задан, ответ думаем. Каков вопрос, таков ответ. Тут надо по подробней
Откуда прилетело? Из попыток синхронизации? Я прав?
но сейчас проблема... Если у одного клиента 2 заказа без договора попали, то он создаёт договор для каждого..
Теперь я Вас не понимаю. Можно как то в скринах. И код студию, ато висят на дубе две вишенки, особенно вторая.Тут все просто. Вопрос задан, ответ думаем. Каков вопрос, таков ответ. Тут надо по подробней
Откуда прилетело? Из попыток синхронизации? Я прав?
Вот смотри. У меня нет договора в счет фактуре. Что я делаю. Иду в Групповое изменение реквизитов.
Ставлю отбор на договоре пусто. и на На закладку произвольный код Повторю. Это разовый код, мне фиолетово на оптимизацию
Договор = Справочники.ДоговорыКонтрагентов.НайтиПоРеквизиту("ВидДоговора",Перечисления.ВидыДоговоровКонтрагентов.СПокупателем,,Объект.Контрагент);
Если Договор.Пустая() Тогда
//Выполнлняем, что вчера совместно придумали. Создание договора
Иначе
Объект.ДоговорКонтрагента = Договор;
КонецЕсли:
Объект.Записать();
Ставлю отбор на договоре пусто. и на На закладку произвольный код Повторю. Это разовый код, мне фиолетово на оптимизацию
Договор = Справочники.ДоговорыКонтрагентов.НайтиПоРеквизиту("ВидДоговора",Перечисления.ВидыДоговоровКонтрагентов.СПокупателем,,Объект.Контрагент);
Если Договор.Пустая() Тогда
//Выполнлняем, что вчера совместно придумали. Создание договора
Иначе
Объект.ДоговорКонтрагента = Договор;
КонецЕсли:
Объект.Записать();
(15)
Выдаёт ошибку, что объект контрагент не обнаружен.
Выдаёт ошибку, что объект контрагент не обнаружен.
&НаСервере
Процедура ОтборДоговораНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СчетНаОплатуПокупателю.Контрагент КАК Владелец,
| СчетНаОплатуПокупателю.Контрагент.Наименование КАК Наименование,
| СчетНаОплатуПокупателю.Организация КАК Организация,
| Значение(Перечисление.ВидыДоговоровКонтрагентов.СПокупателем) как ВидДоговора
|ИЗ
| Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю
|ГДЕ
| СчетНаОплатуПокупателю.ДоговорКонтрагента = ЗНАЧЕНИЕ(Справочник.ДоговорыКонтрагентов.ПустаяСсылка)";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Договор = Справочники.ДоговорыКонтрагентов.НайтиПоРеквизиту("ВидДоговора",Перечисления.ВидыДоговоровКонтрагентов.СПокупателем,,Объект.Контрагент);
Если Договор.Пустая() Тогда
Пока Выборка.следующий() Цикл
НовыйЭлемент = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();
ЗаполнитьЗначенияСвойств(НовыйЭлемент , Выборка);
НовыйЭлемент.УстановитьНовыйКод();
НовыйЭлемент.Записать();
КонецЦикла;
Иначе
Объект.ДоговорКонтрагента = Договор;
КонецЕсли;
Объект.Записать();
КонецПроцедуры
&НаКлиенте
Процедура ОтборДоговора(Команда)
ОтборДоговораНаСервере();
КонецПроцедуры
Показать
(15)
Поменял код на такой, заработало всё. Но сейчас выдаёт ошибку, что "поле объекта не обнаружено (ДоговорКонтрагента)
Иначе
Объект.ДоговорКонтрагента = Договор;
КонецЕсли:
Объект.Записать();
Объект.ДоговорКонтрагента = Договор;
КонецЕсли:
Объект.Записать();
Поменял код на такой, заработало всё. Но сейчас выдаёт ошибку, что "поле объекта не обнаружено (ДоговорКонтрагента)
&НаСервере
Процедура ОтборДоговораНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДоговорыКонтрагентов.Владелец КАК Владелец2,
| ДоговорыКонтрагентов.Ссылка КАК Ссылка,
| СчетНаОплатуПокупателю.Контрагент КАК Владелец,
| СчетНаОплатуПокупателю.Контрагент.Наименование КАК Наименование,
| СчетНаОплатуПокупателю.Организация КАК Организация,
| Значение(Перечисление.ВидыДоговоровКонтрагентов.СПокупателем) как ВидДоговора
|ИЗ
| Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
| ПО СчетНаОплатуПокупателю.ДоговорКонтрагента = ДоговорыКонтрагентов.Ссылка
|ГДЕ
| СчетНаОплатуПокупателю.ДоговорКонтрагента = ЗНАЧЕНИЕ(Справочник.ДоговорыКонтрагентов.ПустаяСсылка)";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.следующий() Цикл
Договор = Справочники.ДоговорыКонтрагентов.НайтиПоНаименованию(Выборка.Владелец);
Сообщить(Договор);
Если Договор.Пустая() Тогда
НовыйЭлемент = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();
ЗаполнитьЗначенияСвойств(НовыйЭлемент , Выборка);
НовыйЭлемент.УстановитьНовыйКод();
НовыйЭлемент.Записать();Сообщить (НовыйЭлемент);
Иначе
Объект.ДоговорКонтрагента = Договор;
КонецЕсли;
Объект.Записать();
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ОтборДоговора(Команда)
ОтборДоговораНаСервере();
КонецПроцедуры
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот