Перестала работать обработка ЗТЧ для Бухгалтерии 3.0 (8.3.7). Мне кажется платформа обновилась и что-то пошло не так...
Обработка заполняет остатками ТМЦ табличную часть документа ТребованиеНакладная.
Как известно, ЗТЧ можно сделать двумя способами - через ОткрытиеФормы или ВызовКлиентскогоМетода.
Мне нужно сделать через ОткрытиеФормы, так как я должен предоставить юзеру возможность на форме задать счета, по которым надо получить остатки.
Только не срабатывает процедура заполнения.
Хотя запрос на получение остатков корректен, проверял в консоли.
&НаКлиенте
Процедура ЗаполнитьДокумент()
ОбъектыНазначенияМассив = Параметры.ОбъектыНазначения;
Для каждого ЭлементОбъектовНазначения из ОбъектыНазначенияМассив Цикл
КлючПоиска = Новый Структура("Ключ", ЭлементОбъектовНазначения);
Окна = ПолучитьОкна();
Для каждого Окно из Окна Цикл
Если НЕ Окно.Основное
И Найти(Окно.Заголовок, ЭлементОбъектовНазначения) Тогда
Форма = ОткрытьФорму("Документ.ТребованиеНакладная.Форма.ФормаДокумента",КлючПоиска,,,Окно);
НовыйОбъект = Форма.Объект;
ЗаполнитьДокументНаСервере(НовыйОбъект);
КопироватьДанныеФормы(НовыйОбъект, Форма.Объект);
КонецЕсли;
КонецЦикла;
ЭтаФорма.Закрыть();
КонецЦикла;
КонецПроцедуры
Показать
&НаСервере
Процедура ЗаполнитьДокументНаСервере(НовыйОбъект) Экспорт
Если НЕ ЗначениеЗаполнено(НовыйОбъект.Склад) Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Укажите склад!");
Возврат;
КонецЕсли;
МассивСчетов = ПолучитьФильтрСчетов();
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Склад", НовыйОбъект.Склад);
Запрос.УстановитьПараметр("МассивСчетов", МассивСчетов);
Запрос.УстановитьПараметр("ДатаОстатков", НовыйОбъект.Дата);
Запрос.УстановитьПараметр("Организация", НовыйОбъект.Организация);
Запрос.Текст = "ВЫБРАТЬ
| ХозрасчетныйОстатки.Субконто1 КАК Номенклатура,
| ХозрасчетныйОстатки.Счет КАК Счет,
| ХозрасчетныйОстатки.КоличествоОстаток КАК Количество
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки(&ДатаОстатков, Счет В ИЕРАРХИИ (&МассивСчетов), ,Организация=&Организация) КАК ХозрасчетныйОстатки
|ГДЕ
| ХозрасчетныйОстатки.Субконто3 = &Склад
|АВТОУПОРЯДОЧИВАНИЕ";
РезультатЗапроса = Запрос.Выполнить();
Если не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
НовыйОбъект.Материалы.Очистить();
Пока Выборка.Следующий() Цикл
СтрокаТабличнойЧасти = НовыйОбъект.Материалы.Добавить();
СтрокаТабличнойЧасти.Номенклатура = Выборка.Номенклатура;
СтрокаТабличнойЧасти.Количество = Выборка.Количество;
СтрокаТабличнойЧасти.Счет = Выборка.Счет;
КонецЦикла;
иначе
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Запрос остатков вернул пустой результат!");
КонецЕсли;
КонецПроцедуры
(9) El_Loco, Насколько я понимаю, основное и активное окно это разные вещи.
Я использую другой синтаксис. Работает вполне корректно.
Смысл в том, что активное окно находим как форму объекта, ссылку которого нам передали.
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения) Экспорт
Для каждого ОбъектНазначение из ОбъектыНазначения Цикл
ПараметрыФормы = Новый Структура("Ключ", ОбъектНазначение); //это передали в форму заполнения
Форма = ПолучитьФорму("Документ.ПриходныйОрдерНаТовары.ФормаОбъекта",ПараметрыФормы); //окна не ищем, переполучаем уже открытое
КопироватьДанныеФормы(Форма.Объект,ЭтотОбъект.ОбъектПриходныйОрдерНаТовары);
НашаОбработкаНаСервере();
КопироватьДанныеФормы(ЭтотОбъект.ОбъектПриходныйОрдерНаТовары,Форма.Объект);
КонецЦикла;
КонецПроцедуры
(1) El_Loco, По коду наугад не подскажу.
Но лично я в таких случаях подключаю внешнюю обработку через http://infostart.ru/public/141765/ и смотрю пошагово, что происходит.
в разные участки кода, чтобы понять где перестает выполняться код.
И докопался до проблемного куска кода. Объясните, почему не работает условие? -- > // Если НЕ Окно.Основное
&НаКлиенте
Процедура ЗаполнитьДокумент()
ОбъектыНазначенияМассив = Параметры.ОбъектыНазначения;
Для каждого ЭлементОбъектовНазначения из ОбъектыНазначенияМассив Цикл
КлючПоиска = Новый Структура("Ключ", ЭлементОбъектовНазначения);
Окна = ПолучитьОкна();
Для каждого Окно из Окна Цикл
//-----------------------------------
// ВОТ В СЛЕДУЮЩЕЕ "ЕСЛИ" ВОЙТИ НЕ ПОЛУЧАЕТСЯ, ПОЭТОМУ НЕ СРАБАТЫВАЕТ ГЛАВНАЯ ПРОЦЕДУРА ПОЛУЧЕНИЯ И ЗАПОЛНЕНИЯ ТАБ.ЧАСТИ
//-----------------------------------
Если НЕ Окно.Основное
И Найти(Окно.Заголовок, ЭлементОбъектовНазначения) Тогда
Форма = ОткрытьФорму("Документ.ТребованиеНакладная.Форма.ФормаДокумента",КлючПоиска,,,Окно);
НовыйОбъект = Форма.Объект;
ЗаполнитьДокументНаСервере(НовыйОбъект);
КопироватьДанныеФормы(НовыйОбъект, Форма.Объект);
КонецЕсли;
КонецЦикла;
ЭтаФорма.Закрыть();
КонецЦикла;
КонецПроцедуры
Я так понимаю проблема в поиске нужного окна с формой обрабатываемого документа.
Логика поиска такая
Окно изменяемого документа будет точно не основным, а вспомогательным, поэтому сразу пропускаем основное окно, а далее идем на не очень хороший способ поиска открытого окна изменяемого документа. Мы просто переберем все окна, а в заголовке, которых будет встречаться Наименование, номер и дата нужного документа - будем изменять
это кусок из комментария другой обработки.
выходит - проблема в том, что надо как-то получить окно...
(9) El_Loco, Насколько я понимаю, основное и активное окно это разные вещи.
Я использую другой синтаксис. Работает вполне корректно.
Смысл в том, что активное окно находим как форму объекта, ссылку которого нам передали.
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения) Экспорт
Для каждого ОбъектНазначение из ОбъектыНазначения Цикл
ПараметрыФормы = Новый Структура("Ключ", ОбъектНазначение); //это передали в форму заполнения
Форма = ПолучитьФорму("Документ.ПриходныйОрдерНаТовары.ФормаОбъекта",ПараметрыФормы); //окна не ищем, переполучаем уже открытое
КопироватьДанныеФормы(Форма.Объект,ЭтотОбъект.ОбъектПриходныйОрдерНаТовары);
НашаОбработкаНаСервере();
КопироватьДанныеФормы(ЭтотОбъект.ОбъектПриходныйОрдерНаТовары,Форма.Объект);
КонецЦикла;
КонецПроцедуры
(10) подскажите пож, как после КопироватьДанныеФормы(ЭтотОбъект.ОбъектПриходныйОрдерНаТовары,Форма.Объект); обновить Форма ? у меня она остается в старом виде, до измениня
вот мой код
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
Для Каждого ОбъектНазначение из ОбъектыНазначенияМассив Цикл
ПараметрыФормы = Новый Структура("Ключ", ОбъектНазначение);
Форма = ПолучитьФорму("Документ.ЗаказКлиента.ФормаОбъекта", ПараметрыФормы);
КопироватьДанныеФормы(Форма.Объект, ЭтотОбъект.ЗаказКлиентаОбъект);
ОткрытьФорму("ВнешняяОбработка.ShopLogisticsОтправка.Форма.ФормаДоставка",
ПолучитьПарамНаСервере(),
ЭтаФорма,
Истина,,,
Новый ОписаниеОповещения("ФормаДоставкаЗавершение",
ЭтаФорма,
ПараметрыФормы),
РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс);
Прервать;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ФормаДоставкаЗавершение(Результат, ДополнительныеПараметры) Экспорт
Форма = ПолучитьФорму("Документ.ЗаказКлиента.ФормаОбъекта", ДополнительныеПараметры);
ЗаполнитьЗаказНаСервере();
КопироватьДанныеФормы(ЗаказКлиентаОбъект, Форма.Объект);
КонецПроцедуры
Посмотрите номер платформы. Похожая беда была. Обновились на 8.3.7.1860(была 1790) и всё стало нормально. Ещё можно посмотреть в режиме совместимости с 8.3.6 как себя ведет.
Столкнулась с подобной проблемой, спасибо, помогли!
Но кое что изменила
ПараметрыФормы = Новый Структура("Ключ", ОбъектНазначение); //это передали в форму заполнения
Форма = ПолучитьФорму("Документ.ПриходныйОрдерНаТовары.ФормаОбъекта",ПараметрыФормы); //окна не ищем, переполучаем уже открытое
можно легко заменить на
Форма = ЭтаФорма.ВладелецФормы
т.к. в моем случае нужен был уникальный идентификатор формы владельца