Не хочет менять проводку через Подписку на событие
Добрый день всем.
Суть в том, что после после перехода с БП 2.0 на 3.0 пришлось затереть доработку. Заключалась она в том, что где стоит в дополнительных сведениях у номенклатуры СчетМЦ05 должен на такой счет и падать. Но если бы подходила старая доработка, то и темы (к счастью) бы не было.
Делаю через ПодпискуНаСобытия. Источником указал документ сам (ПередачаМатериалаВЭксплуатацию), событие ОбработкаПроведения, обработчиком созданный ОбщийМодуль (СчетМЦ05).
Делаю запросомпроверку есть ли в Источнике (это сам документ получается) такая номенклатура, у которой в доп.сведениях стоит СчетМЦ05 и если есть, то Дт=МЦ05. Выглядит код следующим образом:
Не выходит. Пробую другой текст запроса:
Тоже ничего. Честно пару дней пытался что-то сделать, менял названия Счета, но в итоге безрезультатно.
1 скрин: сам код.
2 скрин: сведения о доп. реквизите
3 скрин: что у данной номенклатуры реально стоит СчетМЦ05 ДА.
Суть в том, что после после перехода с БП 2.0 на 3.0 пришлось затереть доработку. Заключалась она в том, что где стоит в дополнительных сведениях у номенклатуры СчетМЦ05 должен на такой счет и падать. Но если бы подходила старая доработка, то и темы (к счастью) бы не было.
Делаю через ПодпискуНаСобытия. Источником указал документ сам (ПередачаМатериалаВЭксплуатацию), событие ОбработкаПроведения, обработчиком созданный ОбщийМодуль (СчетМЦ05).
Делаю запросомпроверку есть ли в Источнике (это сам документ получается) такая номенклатура, у которой в доп.сведениях стоит СчетМЦ05 и если есть, то Дт=МЦ05. Выглядит код следующим образом:
Процедура СчетМЦ05ОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт
Запрос=Новый Запрос;
Запрос.Текст="ВЫБРАТЬ
| ПередачаМатериаловВЭксплуатациюСпецодежда.Номенклатура
|ПОМЕСТИТЬ Материалы
|
|ВЫБРАТЬ
| ПередачаМатериаловВЭксплуатациюИнвентарьИХозяйственныеПринад лежности.Номенклатура
|ИЗ
| Документ.ПередачаМатериаловВЭксплуатацию.ИнвентарьИХозяйственныеПринадлежности КАК ПередачаМатериаловВЭксплуатациюИнвентарьИХозяйственныеПринад лежности
|ГДЕ
| ПередачаМатериаловВЭксплуатациюИнвентарьИХозяйственныеПринад лежности.Ссылка = &Ссылка
|;
|
|ВЫБРАТЬ
| Материалы.Номенклатура
|ИЗ
| Материалы КАК Материалы
|ГДЕ
| Материалы.Номенклатура.ДополнительныеРеквизиты.Значение = &СчетМЦ05";
Запрос.УстановитьПараметр("Ссылка", Источник.Ссылка);
Запрос.УстановитьПараметр("Имя", "СчетМЦ05");
Запрос.УстановитьПараметр("СчетМЦ05",ПланыСчетов.Хозрасчетный.НайтиПоНаименованию("МЦ.05"));
Выбор = Запрос.Выполнить().Выбрать();
Пока Выбор.Следующий() Цикл
Для Каждого ТекДвижение ИЗ Источник.Движения.Хозрасчетный Цикл
Если ТекДвижение.СчетДт = ПланыСчетов.Хозрасчетный.ИнвентарьИХозяйственныеПринадлежностиВЭксплуатации И ТекДвижение.СубконтоДт.Номенклатура = Выбор.Номенклатура Тогда
ТекДвижение.СчетДт = ПланыСчетов.Хозрасчетный.НайтиПоНаименованию("СчетМЦ05");
Источник.Движения.Хозрасчетный.Записать();
КонецЕсли;
КонецЦикла;
ПоказатьНе выходит. Пробую другой текст запроса:
"ВЫБРАТЬ
| ПередачаМатериаловВЭксплуатациюИнвентарьИХозяйственныеПринад лежности.Номенклатура КАК Номенклатура
|ИЗ
| Документ.ПередачаМатериаловВЭксплуатацию.ИнвентарьИХозяйственныеПринадлежности КАК ПередачаМатериаловВЭксплуатациюИнвентарьИХозяйственныеПринад лежности
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
| ПО ПередачаМатериаловВЭксплуатациюИнвентарьИХозяйственныеПринад лежности.Номенклатура = НоменклатураДополнительныеРеквизиты.Ссылка
|ГДЕ
| ПередачаМатериаловВЭксплуатациюИнвентарьИХозяйственныеПринад лежности.Ссылка = &Ссылка
| И НоменклатураДополнительныеРеквизиты.Свойство.Имя = &Имя
|
|СГРУППИРОВАТЬ ПО
| ПередачаМатериаловВЭксплуатациюИнвентарьИХозяйственныеПринад лежности.Номенклатура" ;
Запрос.УстановитьПараметр("Ссылка", Источник.Ссылка);
Запрос.УстановитьПараметр("Имя", "СчетМЦ05"); //имя у тебя может отличатся
Выбор = Запрос.Выполнить().Выбрать();
ПоказатьТоже ничего. Честно пару дней пытался что-то сделать, менял названия Счета, но в итоге безрезультатно.
1 скрин: сам код.
2 скрин: сведения о доп. реквизите
3 скрин: что у данной номенклатуры реально стоит СчетМЦ05 ДА.
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
(85)
ТЗ = Источник.ИнвентарьИХозяйственныеПринадлежности.Выгрузить(,"Номенклатура");
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ТЗ.Номенклатура КАК Номенклатура
|ПОМЕСТИТЬ вт_тз
|ИЗ
| &ТЗ КАК ТЗ
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| вт_тз.Номенклатура КАК Номенклатура
|ИЗ
| вт_тз КАК вт_тз
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведения
| ПО вт_тз.Номенклатура = ДополнительныеСведения.Объект
| И (ДополнительныеСведения.Свойство = &Свойство)
| И (ДополнительныеСведения.Значение = ИСТИНА)
|";
Запрос.УстановитьПараметр("ТЗ", ТЗ);
Запрос.УстановитьПараметр("Свойство", ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("СчетМЦ05 (Номенклатура)")); // тут нужно посмотреть точно как называется свойство в плане видов характеристик
Выбор = Запрос.Выполнить().Выбрать();
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) на момент запроса движения еще могут быть не записаны. Следовательно в запросе данные по ссылке на документ могут быть неверными.
Проще через Источник получить всю номенклатуру и в запросе отобрать нужную номенклатуру из имеющейся, без использования ссылки на документ.
Ну, или перед запросом сделать запись движений источника. Но первый вариант лучше.
Проще через Источник получить всю номенклатуру и в запросе отобрать нужную номенклатуру из имеющейся, без использования ссылки на документ.
Ну, или перед запросом сделать запись движений источника. Но первый вариант лучше.
(1) попробуй так:
НаборЗаписей = Источник.Движения["Хозрасчетный"];
Если НаборЗаписей.Количество() = 0 Тогда
НаборЗаписей.Прочитать();
КонецЕсли;
ТаблицаДвижений = НаборЗаписей.Выгрузить();
Для Каждого ЗаписьТаблицы Из ТаблицаДвижений Цикл
//по нужному условию меняй счет:
ЗаписьТаблицы[СчетДт] = ПланыСчетов.Хозрасчетный.НайтиПоНаименованию("СчетМЦ05");
КонецЦикла;
НаборЗаписей.Очистить();
НаборЗаписей.Записать();
НаборЗаписей.Загрузить(ТаблицаДвижений);
НаборЗаписей.Записать(Ложь);
НаборЗаписей = Источник.Движения["Хозрасчетный"];
Если НаборЗаписей.Количество() = 0 Тогда
НаборЗаписей.Прочитать();
КонецЕсли;
ТаблицаДвижений = НаборЗаписей.Выгрузить();
Для Каждого ЗаписьТаблицы Из ТаблицаДвижений Цикл
//по нужному условию меняй счет:
ЗаписьТаблицы[СчетДт] = ПланыСчетов.Хозрасчетный.НайтиПоНаименованию("СчетМЦ05");
КонецЦикла;
НаборЗаписей.Очистить();
НаборЗаписей.Записать();
НаборЗаписей.Загрузить(ТаблицаДвижений);
НаборЗаписей.Записать(Ложь);
(12) Так. Извиняюсь конечно, я во все это только вникаю, ооочень сложно всё это понять пока что. Надо оставить текст запроса? Или как мне ещё сделать это условие? По идее же именно запросом выбираю номенклатуру из документа в которой стоит доп. реквизит и там уже подменяю. Но я сейчас попробовал, естественно не сработало. Как тогда написать данное условие?
(15) теперь все же прочитать (2).
Вариант выполнения:
1. Выгрузить номенклатуру из ТЧ документа через Источник:
ТЗ = Источник.ИнвентарьИХозяйственныеПринадлежности.Выгрузить(,"НомерСтроки, Номенлатура");
2. Загрузить в запрос полученную ТЗ.
3. Из временной таблицы с загруженной ТЗ выбрать те записи, которые соответствуют нужным параметрам.
4. Полученный результат обрабатываем.
Вариант выполнения:
1. Выгрузить номенклатуру из ТЧ документа через Источник:
ТЗ = Источник.ИнвентарьИХозяйственныеПринадлежности.Выгрузить(,"НомерСтроки, Номенлатура");
2. Загрузить в запрос полученную ТЗ.
3. Из временной таблицы с загруженной ТЗ выбрать те записи, которые соответствуют нужным параметрам.
4. Полученный результат обрабатываем.
(23) что именно не получается?
В ТЗ выгрузили номенклатуру из документа?
В запрос поместить ТЗ и получить нужную выборку. Пример:
Далее уже обрабатываете выборку.
Конструктором запроса будет невозможно работать при таком запросе. Будет ругаться. Но это всего лишь ограничение конструктора запроса. Работать будет и опыт набирать запрос без конструктора пригодится.
Но если вообще никак без конструктора, тогда можно выразить номенклатуру в запросе:
Соответственно условие заменить на свое.
В ТЗ выгрузили номенклатуру из документа?
В запрос поместить ТЗ и получить нужную выборку. Пример:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТЗ.Номенклатура КАК Номенклатура
|ПОМЕСТИТЬ вт_тз
|ИЗ
| &ТЗ КАК ТЗ
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| вт_тз.Номенклатура КАК Номенклатура
|ИЗ
| вт_тз КАК вт_тз
|ГДЕ
| вт_тз.Номенклатура.Артикул = ""М2"" ";
Запрос.УстановитьПараметр("ТЗ", ТЗ);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
ПоказатьДалее уже обрабатываете выборку.
Конструктором запроса будет невозможно работать при таком запросе. Будет ругаться. Но это всего лишь ограничение конструктора запроса. Работать будет и опыт набирать запрос без конструктора пригодится.
Но если вообще никак без конструктора, тогда можно выразить номенклатуру в запросе:
|ГДЕ
| ВЫРАЗИТЬ(вт_тз.Номенклатура КАК Справочник.Номенклатура).Артикул = ""М2""";
Соответственно условие заменить на свое.
(31) вт_тз это произвольное имя которое дается временной таблице. Можно оставить как есть. Можно свое присвоить.
Весь запрос можно оставить как есть, только условие в секции ГДЕ свое поставить:
Весь запрос можно оставить как есть, только условие в секции ГДЕ свое поставить:
|ГДЕ
| вт_тз.Номенклатура.ДополнительныеРеквизиты.Значение = &СчетМЦ05
(40) ну да.
Сразу извиняюсь за глупый вопрос, но мне так понятнее будет, сразу избежим много ошибок.
Запрос который Вы мне дали мы пишем внутри
Или где? Правильно же я сейчас делаю?
Сразу извиняюсь за глупый вопрос, но мне так понятнее будет, сразу избежим много ошибок.
Запрос который Вы мне дали мы пишем внутри
НаборЗаписей = Источник.Движения["Хозрасчетный"];
Если НаборЗаписей.Количество() = 0 Тогда
НаборЗаписей.Прочитать();
КонецЕсли;
ТаблицаДвижений = НаборЗаписей.Выгрузить();
Для Каждого ЗаписьТаблицы Из ТаблицаДвижений Цикл
//по нужному условию меняй счет:
ЗаписьТаблицы[СчетДт] = ПланыСчетов.Хозрасчетный.НайтиПоНаименованию("СчетМЦ05");
КонецЦикла;
НаборЗаписей.Очистить();
НаборЗаписей.Записать();
НаборЗаписей.Загрузить(ТаблицаДвижений);
НаборЗаписей.Записать(Ложь);
ПоказатьИли где? Правильно же я сейчас делаю?
(46) не сработало. Наимнование в плане счетов именно такое. Заходил, копировал и вставлял. Но всё равно встаёт МЦ04. Есть какая нибудь мысль почему? Написано то всё верно вроде.
прошу, подкиньте идею или укажите на ошибку в коде. Может в Запрос.УстановитьПараметр("СчетМЦ05"...)? Там надо устанавдивать параметр откуда?
ТЗ = Источник.ИнвентарьИХозяйственныеПринадлежности.Выгрузить(,"Номенклатура");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТЗ.Номенклатура КАК Номенклатура
|ПОМЕСТИТЬ вт_тз
|ИЗ
| &ТЗ КАК ТЗ
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| вт_тз.Номенклатура КАК Номенклатура
|ИЗ
| вт_тз КАК вт_тз
|ГДЕ
| вт_тз.Номенклатура.ДополнительныеРеквизиты.Значение = &СчетМЦ05";
Запрос.УстановитьПараметр("ТЗ", ТЗ);
Запрос.УстановитьПараметр("СчетМЦ05",ПланыСчетов.Хозрасчетный.НайтиПоНаименованию("Автомобильные шины для летнего (зимнего) сезона"));
РезультатЗапроса = Запрос.Выполнить();
Выбор = Запрос.Выполнить().Выбрать();
Пока Выбор.Следующий() Цикл
Для Каждого ТекДвижение ИЗ Источник.Движения.Хозрасчетный Цикл
Если ТекДвижение.СчетДт = ПланыСчетов.Хозрасчетный.ИнвентарьИХозяйственныеПринадлежностиВЭксплуатации И ТекДвижение.СубконтоДт.Номенклатура = Выбор.Номенклатура Тогда
ТекДвижение.СчетДт = ПланыСчетов.Хозрасчетный.НайтиПоНаименованию("Автомобильные шины для летнего (зимнего) сезона");
КонецЕсли;
КонецЦикла;
КонецЦикла;
Источник.Движения.Хозрасчетный.Записать();
Показатьпрошу, подкиньте идею или укажите на ошибку в коде. Может в Запрос.УстановитьПараметр("СчетМЦ05"...)? Там надо устанавдивать параметр откуда?
(85)
ТЗ = Источник.ИнвентарьИХозяйственныеПринадлежности.Выгрузить(,"Номенклатура");
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ТЗ.Номенклатура КАК Номенклатура
|ПОМЕСТИТЬ вт_тз
|ИЗ
| &ТЗ КАК ТЗ
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| вт_тз.Номенклатура КАК Номенклатура
|ИЗ
| вт_тз КАК вт_тз
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведения
| ПО вт_тз.Номенклатура = ДополнительныеСведения.Объект
| И (ДополнительныеСведения.Свойство = &Свойство)
| И (ДополнительныеСведения.Значение = ИСТИНА)
|";
Запрос.УстановитьПараметр("ТЗ", ТЗ);
Запрос.УстановитьПараметр("Свойство", ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("СчетМЦ05 (Номенклатура)")); // тут нужно посмотреть точно как называется свойство в плане видов характеристик
Выбор = Запрос.Выполнить().Выбрать();
Показать
(86) Добавил идентичный вид Субконто в МЦ05, на что ругалось. Теперь Вылезает следующая ошибка:
Хотя я создавал и сответственно проводил документ с поступланием этих шин на этот склад, да и до этого не ругалось. Как то странно.
А название свойства Вы правильно написали, идентично.
Хотя я создавал и сответственно проводил документ с поступланием этих шин на этот склад, да и до этого не ругалось. Как то странно.
А название свойства Вы правильно написали, идентично.
Прикрепленные файлы:
(40)
Запись не верна! Вид субконто "Статьи затрат" не доступен для данной записи! (Регистр бухгалтерии: Журнал проводок (бухгалтерский и налоговый учет); Номер строки: 1)
Теперь то что 1С-ке не нравится? Чего она от меня хочет. (я вижу конечно, но как это то поправить)
Запись не верна! Вид субконто "Статьи затрат" не доступен для данной записи! (Регистр бухгалтерии: Журнал проводок (бухгалтерский и налоговый учет); Номер строки: 1)
Теперь то что 1С-ке не нравится? Чего она от меня хочет. (я вижу конечно, но как это то поправить)
(14) Не всегда и не везде. Во многих современных типовых отражение в рег. учете идет уже после проведения документа.
И даже если проводки будут сделаны в момент проведения документа это не значит что они не будут в последсвии переотражены в рамках закрытия месяца или проведения отложенных расчетов.
И даже если проводки будут сделаны в момент проведения документа это не значит что они не будут в последсвии переотражены в рамках закрытия месяца или проведения отложенных расчетов.
(19) Тут очень конктретно названа конфигурация БП 3.0 в которой есть отложенный пересчет. Вы гарантируете что в последствии движения по этому регистратору не будут записаны заново после расчета стоимости материалов ?
Вообще эту задачу (с заменой счета учета в зависимости от условий) можно решить без изменений конфигурации, но это уже другая история.
Вообще эту задачу (с заменой счета учета в зависимости от условий) можно решить без изменений конфигурации, но это уже другая история.
(26) Определение стоимости МПЗ, зачет авансов и расчеты с контрагентами могут происходить в рамках закрытия месяца, а не в момент проведения документа.
Общая идея такая что часть проводок могут быть иногда перезаписаны без проведения документа и чтобы при этом не потерять свои изменения, такие как подмена счетов учета стоит работать с набор записи в момент записи регистра, а не с моментом проведения документа.
Общая идея такая что часть проводок могут быть иногда перезаписаны без проведения документа и чтобы при этом не потерять свои изменения, такие как подмена счетов учета стоит работать с набор записи в момент записи регистра, а не с моментом проведения документа.
(29) Можно сделать свое регламентное задание из внешней обработки, БСП БУХ 3 это позволяет. И уже с помощью рег. задания анализировать движения определенных документов по определенным счетам и подменять счет учета и аналитику если нужно.
Никаких изменений конфигурации.
Никаких изменений конфигурации.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот