Как исправить вызов клиентской процедуры из серверной в 1С?

База знаний Одина — Одинэсника Форумы ODIN — Форум по 1С Предприятию Как исправить вызов клиентской процедуры из серверной в 1С?

Просмотр 1 ветки ответов
  • Автор
    Сообщения
    • #37150
      Фото аватараOdineski
      Участник

        А этот код исправленный проверь : &НаКлиенте
        Процедура ФормаЗаполненияДействие(Команда)
        ГодОтчета = ЭтотОбъект[«ОТЧ»].ПривестиЗначение(_ОтчетГод);
        Если ГодОтчета < 2010 Или ГодОтчета > 2099 Тогда
        ОбщегоНазначенияКлиент.СообщитьПользователю(«Некорректно указан год», , «_ОтчетГод»);
        Возврат;
        КонецЕсли;
        Если Не ЗначениеЗаполнено(_Период) Тогда
        ОбщегоНазначенияКлиент.СообщитьПользователю(«Не указан период», , «_Период»);
        Возврат;
        КонецЕсли;

        ЗаполнитьИзДокументаНаСервере(ГодОтчета, _Период);
        КонецПроцедуры

        &НаСервере
        Процедура ЗаполнитьИзДокументаНаСервере(ГодОтчета, Период)
        // Очищаем старые данные
        _РеестрДокПОбНЛ.Очистить();
        _ПредТипДог.Строки.Очистить();

        // Запрос к документу. Имена реквизитов уточните по вашей конфигурации!
        Запрос = Новый Запрос;
        Запрос.Текст =
        «ВЫБРАТЬ
        | ПНДС.Ссылка,
        | ПНДС.КодОперации,
        | ПНДС.ВидОперации,
        | ПНДС.Сумма,
        | ПНДС.Контрагент,
        | Контрагент.Наименование КАК НаименованиеКонтрагента,
        | Контрагент.ИНН КАК ИНН,
        | Контрагент.КПП КАК КПП,
        | ПНДС.ДокументОснование,
        | ДокОснование.Номер КАК НомерДокумента,
        | ДокОснование.Дата КАК ДатаДокумента,
        | ВЫРАЗИТЬ(ДокОснование.Ссылка КАК СТРОКА(150)) КАК ТипДокумента
        |ИЗ
        | Документ.ПодтверждениеНулевойСтавкиНДС КАК ПНДС
        | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагент ПО ПНДС.Контрагент = Контрагент.Ссылка
        | ЛЕВОЕ СОЕДИНЕНИЕ Документ.УниверсальныйПередаточныйДокумент КАК ДокОснование ПО ПНДС.ДокументОснование = ДокОснование.Ссылка
        |ГДЕ
        | ПНДС.Дата МЕЖДУ &ДатаНач И &ДатаКонец
        |УПОРЯДОЧИТЬ ПО
        | ПНДС.КодОперации, ПНДС.ВидОперации, НаименованиеКонтрагента, ПНДС.Дата»;

        Запрос.УстановитьПараметр(«ДатаНач», НачалоДня(Период));
        Запрос.УстановитьПараметр(«ДатаКонец», КонецДня(Период));

        Результат = Запрос.Выполнить();
        Выборка = Результат.Выбрать();

        Если Не Выборка.Следующий() Тогда
        ОбщегоНазначенияКлиент.СообщитьПользователю(«Нет документов ПодтверждениеНулевойСтавкиНДС за указанный период.»);
        Возврат;
        КонецЕсли;

        // Словари для группировки
        СоответствиеКодВид = Новый Соответствие;
        УИД_КодВид = Новый Соответствие;

        // Первый проход: создаём строки в реестре по уникальным комбинациям код+вид
        Выборка.Сбросить();
        Пока Выборка.Следующий() Цикл
        Ключ = Выборка.КодОперации + «|» + Выборка.ВидОперации;
        Если Не СоответствиеКодВид.Свойство(Ключ) Тогда
        НоваяСтрока = _РеестрДокПОбНЛ.Добавить();
        НоваяСтрока.УИД = Новый УникальныйИдентификатор;
        НоваяСтрока.КодОпер = Выборка.КодОперации;
        НоваяСтрока.ВидОпер = Выборка.ВидОперации;
        НоваяСтрока.СумНеоблОпер = 0;
        НоваяСтрока.ОписаниеОперации = «Операции по коду » + Выборка.КодОперации;
        СоответствиеКодВид.Вставить(Ключ, НоваяСтрока);
        УИД_КодВид.Вставить(Ключ, НоваяСтрока.УИД);
        КонецЕсли;
        КонецЦикла;

        // Для каждого уникального код+вид создаём корневой узел в дереве
        Для каждого Ключ Из УИД_КодВид Цикл
        Корневой = _ПредТипДог.Строки.Добавить();
        Корневой.УИД = Ключ.Значение;
        Корневой.УИДЛок = Новый УникальныйИдентификатор;
        Корневой.ИмяФайлДог = «»;
        Корневой.ОписаниеКА = «Документы по коду операции»;
        Корневой.СумОпер = 0;
        КонецЦикла;

        // Второй проход: добавляем контрагентов и документы
        Выборка.Сбросить();
        СоответствиеКонтрагентов = Новый Соответствие;

        Пока Выборка.Следующий() Цикл
        КлючКодВид = Выборка.КодОперации + «|» + Выборка.ВидОперации;
        УИД_Родителя = УИД_КодВид[КлючКодВид];
        Корневой = _ПредТипДог.Строки.Найти(УИД_Родителя, «УИД»);
        Если Корневой = Неопределено Тогда Продолжить; КонецЕсли;

        // Ключ контрагента
        ИНН = СокрЛП(Выборка.ИНН);
        КПП = СокрЛП(Выборка.КПП);
        Наименование = СокрЛП(Выборка.НаименованиеКонтрагента);
        КлючКонтрагента = Строка(УИД_Родителя) + «|» + ИНН + «|» + КПП + «|» + Наименование;

        УзелКонтрагента = Неопределено;
        Если Не СоответствиеКонтрагентов.Свойство(КлючКонтрагента, УзелКонтрагента) Тогда
        УзелКонтрагента = Корневой.Строки.Добавить();
        ЗаполнитьЗначенияСвойств(УзелКонтрагента, Новый Структура(«УИД,НаимОрг,ИННЮЛ,КПП,СумОпер,УИДЛок,ОписаниеКА»));
        УзелКонтрагента.УИД = УИД_Родителя;
        УзелКонтрагента.УИДЛок = Новый УникальныйИдентификатор;
        УзелКонтрагента.НаимОрг = Наименование;
        УзелКонтрагента.ИННЮЛ = ИНН;
        УзелКонтрагента.КПП = КПП;
        УзелКонтрагента.СумОпер = 0;
        УзелКонтрагента.ОписаниеКА = Наименование + «, ИНН/КПП: » + ИНН + «/» + КПП;
        СоответствиеКонтрагентов.Вставить(КлючКонтрагента, УзелКонтрагента);
        КонецЕсли;

        // Добавляем документ
        Номер = СокрЛП(Выборка.НомерДокумента);
        ДатаДок = Выборка.ДатаДокумента;
        ТипДок = «УТД»;
        Есть = Ложь;
        Для Каждого СтрДок Из УзелКонтрагента.Строки Цикл
        Если СтрДок.НомДок = Номер И СтрДок.ДатаДок = ДатаДок Тогда Есть = Истина; Прервать; КонецЕсли;
        КонецЦикла;
        Если Не Есть Тогда
        УзелДокумента = УзелКонтрагента.Строки.Добавить();
        УзелДокумента.УИД = УИД_Родителя;
        УзелДокумента.УИДЛок = Новый УникальныйИдентификатор;
        УзелДокумента.ТипДок = ТипДок;
        УзелДокумента.НомДок = Номер;
        УзелДокумента.ДатаДок = ДатаДок;
        УзелДокумента.ОписаниеКА = ТипДок + » №» + Номер + » от » + Формат(ДатаДок, «ДЛФ=DD; ДП=-«);
        УзелДокумента.Сумма = Выборка.Сумма;
        КонецЕсли;

        // Накопление сумм
        УзелКонтрагента.СумОпер = УзелКонтрагента.СумОпер + Выборка.Сумма;
        Корневой.СумОпер = Корневой.СумОпер + Выборка.Сумма;

        СтрокаРеестра = СоответствиеКодВид[КлючКодВид];
        СтрокаРеестра.СумНеоблОпер = СтрокаРеестра.СумНеоблОпер + Выборка.Сумма;
        КонецЦикла;

        Модифицированность = Истина;
        Доступность = Истина;
        ОбщегоНазначенияКлиент.СообщитьПользователю(«Загрузка завершена. Обработано документов: » + _РеестрДокПОбНЛ.Количество());
        КонецПроцедуры

      • #37151
        bot_avaOdin — Одинэсник
        Участник

          Код в целом написан грамотно, но есть несколько важных моментов, которые нужно проверить и поправить:

          1. Вызов клиентской процедуры из серверной
          В серверной процедуре вызывается:

          Это вызов клиентской процедуры из сервера — так делать нельзя. Нужно либо возвращать результат на клиент и там показывать сообщение, либо использовать события. В текущем виде будет ошибка выполнения.

          2. Проверка пустой выборки
          Вы используете:

          Это сдвигает курсор выборки, и при дальнейшем переборе данные будут пропущены. Лучше использовать:

          Или сохранить результат в переменную.

          3. Обращение к табличным частям _РеестрДокПОбНЛ и _ПредТипДог
          Убедитесь, что эти объекты — табличные части текущего объекта (ЭтотОбъект) или доступны в контексте процедуры. Если это реквизиты формы, то их нужно передавать или работать с ними на клиенте.

          4. Переменные Модифицированность и Доступность
          Они не объявлены и не связаны с объектом. Если это свойства формы, нужно обращаться через ЭтотОбъект или ЭлементыФормы.

          5. Переменные _ОтчетГод и _Период
          Убедитесь, что они определены и доступны в контексте формы.

          6. Обработка ошибок
          В запросе и работе с данными нет обработки исключений. Рекомендую добавить Попытка...Исключение для устойчивости.

          7. Оптимизация
          В циклах и проверках можно добавить комментарии для удобства поддержки.

          Кратко:

          — Исправьте вызов ОбщегоНазначенияКлиент.СообщитьПользователю из сервера — сделайте возврат результата и покажите сообщение на клиенте.
          — Используйте Выборка.Пустая() для проверки отсутствия данных.
          — Проверьте доступность и корректность табличных частей.
          — Уточните контекст переменных и свойств.

          Если нужно, могу помочь с примером исправленного кода по этим моментам.

      Просмотр 1 ветки ответов
      • Для ответа в этой теме необходимо авторизоваться.
      База знаний 1С