База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как исправить вызов клиентской процедуры из серверной в 1С?
- В этой теме 1 ответ, 2 участника, последнее обновление 13 часов, 13 минут назад сделано
Odin — Одинэсник.
-
АвторСообщения
-
-
13 мая 2026 в 16:42 #37150
А этот код исправленный проверь : &НаКлиенте
Процедура ФормаЗаполненияДействие(Команда)
ГодОтчета = ЭтотОбъект[«ОТЧ»].ПривестиЗначение(_ОтчетГод);
Если ГодОтчета < 2010 Или ГодОтчета > 2099 Тогда
ОбщегоНазначенияКлиент.СообщитьПользователю(«Некорректно указан год», , «_ОтчетГод»);
Возврат;
КонецЕсли;
Если Не ЗначениеЗаполнено(_Период) Тогда
ОбщегоНазначенияКлиент.СообщитьПользователю(«Не указан период», , «_Период»);
Возврат;
КонецЕсли;ЗаполнитьИзДокументаНаСервере(ГодОтчета, _Период);
КонецПроцедуры&НаСервере
Процедура ЗаполнитьИзДокументаНаСервере(ГодОтчета, Период)
// Очищаем старые данные
_РеестрДокПОбНЛ.Очистить();
_ПредТипДог.Строки.Очистить();// Запрос к документу. Имена реквизитов уточните по вашей конфигурации!
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| ПНДС.Ссылка,
| ПНДС.КодОперации,
| ПНДС.ВидОперации,
| ПНДС.Сумма,
| ПНДС.Контрагент,
| Контрагент.Наименование КАК НаименованиеКонтрагента,
| Контрагент.ИНН КАК ИНН,
| Контрагент.КПП КАК КПП,
| ПНДС.ДокументОснование,
| ДокОснование.Номер КАК НомерДокумента,
| ДокОснование.Дата КАК ДатаДокумента,
| ВЫРАЗИТЬ(ДокОснование.Ссылка КАК СТРОКА(150)) КАК ТипДокумента
|ИЗ
| Документ.ПодтверждениеНулевойСтавкиНДС КАК ПНДС
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагент ПО ПНДС.Контрагент = Контрагент.Ссылка
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.УниверсальныйПередаточныйДокумент КАК ДокОснование ПО ПНДС.ДокументОснование = ДокОснование.Ссылка
|ГДЕ
| ПНДС.Дата МЕЖДУ &ДатаНач И &ДатаКонец
|УПОРЯДОЧИТЬ ПО
| ПНДС.КодОперации, ПНДС.ВидОперации, НаименованиеКонтрагента, ПНДС.Дата»;Запрос.УстановитьПараметр(«ДатаНач», НачалоДня(Период));
Запрос.УстановитьПараметр(«ДатаКонец», КонецДня(Период));Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();Если Не Выборка.Следующий() Тогда
ОбщегоНазначенияКлиент.СообщитьПользователю(«Нет документов ПодтверждениеНулевойСтавкиНДС за указанный период.»);
Возврат;
КонецЕсли;// Словари для группировки
СоответствиеКодВид = Новый Соответствие;
УИД_КодВид = Новый Соответствие;// Первый проход: создаём строки в реестре по уникальным комбинациям код+вид
Выборка.Сбросить();
Пока Выборка.Следующий() Цикл
Ключ = Выборка.КодОперации + «|» + Выборка.ВидОперации;
Если Не СоответствиеКодВид.Свойство(Ключ) Тогда
НоваяСтрока = _РеестрДокПОбНЛ.Добавить();
НоваяСтрока.УИД = Новый УникальныйИдентификатор;
НоваяСтрока.КодОпер = Выборка.КодОперации;
НоваяСтрока.ВидОпер = Выборка.ВидОперации;
НоваяСтрока.СумНеоблОпер = 0;
НоваяСтрока.ОписаниеОперации = «Операции по коду » + Выборка.КодОперации;
СоответствиеКодВид.Вставить(Ключ, НоваяСтрока);
УИД_КодВид.Вставить(Ключ, НоваяСтрока.УИД);
КонецЕсли;
КонецЦикла;// Для каждого уникального код+вид создаём корневой узел в дереве
Для каждого Ключ Из УИД_КодВид Цикл
Корневой = _ПредТипДог.Строки.Добавить();
Корневой.УИД = Ключ.Значение;
Корневой.УИДЛок = Новый УникальныйИдентификатор;
Корневой.ИмяФайлДог = «»;
Корневой.ОписаниеКА = «Документы по коду операции»;
Корневой.СумОпер = 0;
КонецЦикла;// Второй проход: добавляем контрагентов и документы
Выборка.Сбросить();
СоответствиеКонтрагентов = Новый Соответствие;Пока Выборка.Следующий() Цикл
КлючКодВид = Выборка.КодОперации + «|» + Выборка.ВидОперации;
УИД_Родителя = УИД_КодВид[КлючКодВид];
Корневой = _ПредТипДог.Строки.Найти(УИД_Родителя, «УИД»);
Если Корневой = Неопределено Тогда Продолжить; КонецЕсли;// Ключ контрагента
ИНН = СокрЛП(Выборка.ИНН);
КПП = СокрЛП(Выборка.КПП);
Наименование = СокрЛП(Выборка.НаименованиеКонтрагента);
КлючКонтрагента = Строка(УИД_Родителя) + «|» + ИНН + «|» + КПП + «|» + Наименование;УзелКонтрагента = Неопределено;
Если Не СоответствиеКонтрагентов.Свойство(КлючКонтрагента, УзелКонтрагента) Тогда
УзелКонтрагента = Корневой.Строки.Добавить();
ЗаполнитьЗначенияСвойств(УзелКонтрагента, Новый Структура(«УИД,НаимОрг,ИННЮЛ,КПП,СумОпер,УИДЛок,ОписаниеКА»));
УзелКонтрагента.УИД = УИД_Родителя;
УзелКонтрагента.УИДЛок = Новый УникальныйИдентификатор;
УзелКонтрагента.НаимОрг = Наименование;
УзелКонтрагента.ИННЮЛ = ИНН;
УзелКонтрагента.КПП = КПП;
УзелКонтрагента.СумОпер = 0;
УзелКонтрагента.ОписаниеКА = Наименование + «, ИНН/КПП: » + ИНН + «/» + КПП;
СоответствиеКонтрагентов.Вставить(КлючКонтрагента, УзелКонтрагента);
КонецЕсли;// Добавляем документ
Номер = СокрЛП(Выборка.НомерДокумента);
ДатаДок = Выборка.ДатаДокумента;
ТипДок = «УТД»;
Есть = Ложь;
Для Каждого СтрДок Из УзелКонтрагента.Строки Цикл
Если СтрДок.НомДок = Номер И СтрДок.ДатаДок = ДатаДок Тогда Есть = Истина; Прервать; КонецЕсли;
КонецЦикла;
Если Не Есть Тогда
УзелДокумента = УзелКонтрагента.Строки.Добавить();
УзелДокумента.УИД = УИД_Родителя;
УзелДокумента.УИДЛок = Новый УникальныйИдентификатор;
УзелДокумента.ТипДок = ТипДок;
УзелДокумента.НомДок = Номер;
УзелДокумента.ДатаДок = ДатаДок;
УзелДокумента.ОписаниеКА = ТипДок + » №» + Номер + » от » + Формат(ДатаДок, «ДЛФ=DD; ДП=-«);
УзелДокумента.Сумма = Выборка.Сумма;
КонецЕсли;// Накопление сумм
УзелКонтрагента.СумОпер = УзелКонтрагента.СумОпер + Выборка.Сумма;
Корневой.СумОпер = Корневой.СумОпер + Выборка.Сумма;СтрокаРеестра = СоответствиеКодВид[КлючКодВид];
СтрокаРеестра.СумНеоблОпер = СтрокаРеестра.СумНеоблОпер + Выборка.Сумма;
КонецЦикла;Модифицированность = Истина;
Доступность = Истина;
ОбщегоНазначенияКлиент.СообщитьПользователю(«Загрузка завершена. Обработано документов: » + _РеестрДокПОбНЛ.Количество());
КонецПроцедуры -
13 мая 2026 в 16:42 #37151
Код в целом написан грамотно, но есть несколько важных моментов, которые нужно проверить и поправить:
1. Вызов клиентской процедуры из серверной
В серверной процедуре вызывается:1С (Код)1ОбщегоНазначенияКлиент.СообщитьПользователю(...)Это вызов клиентской процедуры из сервера — так делать нельзя. Нужно либо возвращать результат на клиент и там показывать сообщение, либо использовать события. В текущем виде будет ошибка выполнения.
2. Проверка пустой выборки
Вы используете:1С (Код)123Если Не Выборка.Следующий() Тогда...КонецЕсли;Это сдвигает курсор выборки, и при дальнейшем переборе данные будут пропущены. Лучше использовать:
1С (Код)123Если Выборка.Пустая() Тогда...КонецЕсли;Или сохранить результат в переменную.
3. Обращение к табличным частям
_РеестрДокПОбНЛи_ПредТипДог
Убедитесь, что эти объекты — табличные части текущего объекта (ЭтотОбъект) или доступны в контексте процедуры. Если это реквизиты формы, то их нужно передавать или работать с ними на клиенте.4. Переменные
МодифицированностьиДоступность
Они не объявлены и не связаны с объектом. Если это свойства формы, нужно обращаться черезЭтотОбъектилиЭлементыФормы.5. Переменные
_ОтчетГоди_Период
Убедитесь, что они определены и доступны в контексте формы.6. Обработка ошибок
В запросе и работе с данными нет обработки исключений. Рекомендую добавитьПопытка...Исключениедля устойчивости.7. Оптимизация
В циклах и проверках можно добавить комментарии для удобства поддержки.—
Кратко:
— Исправьте вызов
ОбщегоНазначенияКлиент.СообщитьПользователюиз сервера — сделайте возврат результата и покажите сообщение на клиенте.
— ИспользуйтеВыборка.Пустая()для проверки отсутствия данных.
— Проверьте доступность и корректность табличных частей.
— Уточните контекст переменных и свойств.—
Если нужно, могу помочь с примером исправленного кода по этим моментам.
-
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.