Имя: Пароль:
1C
1С v8
v8: Процедура или функция с указанным именем не определена (РасчетТребКолТов)
0 sidalexsandr
 
06.11.12
15:15
Функция на которую ругается 1с определена в модуле объекта (документ) выше процедуры из которой вызывается эта функция. 1с выдает ошибку:

{Документ.Ведомость.МодульОбъекта(57,8)}: Процедура или функция с указанным именем не определена (РасчетТребКолТов)
       ТЗ = <<?>>РасчетТребКолТов(ДанныеЗаполнения.Ссылка);     (Проверка: Толстый клиент (обычное приложение))
1 sidalexsandr
 
06.11.12
15:16
Вот текст фунции и процедуры:
// Выполняет на Сервере запрос для заполнения табличной
// части этого документа
//
// Возвращаемое значение:
//   Наименование комплектующего и требуемого количество
// по каждому комплектующему
//
&НаСервереБезКонтекста  
Функция РасчетТребКолТов(ЗаявкаПроизводство)
   Запрос = Новый Запрос;
   Запрос.Текст = "
   |Выбрать  
   |    Наименование КАК КомплектующееНаименование, (КоличествоКомплекта*Количество) КАК ТребуемоеКоличество
   |ИЗ
   |(ВЫБРАТЬ
   |    ЗаявкаНаПроизводствоТовары.Ссылка,
   |    ЗаявкаНаПроизводствоТовары.Номенклатура,
   |    ЗаявкаНаПроизводствоТовары.Количество,
   |    ЗаявкаНаПроизводствоТовары.Комплект.Ссылка,
   |    Компл.Ссылка,
   |    Компл.Наименование,
   |    Компл.Количество КАК КоличествоКомплекта
   |ИЗ
   |    Документ.ЗаявкаНаПроизводство.Товары КАК ЗаявкаНаПроизводствоТовары
   |СОЕДИНЕНИЕ Документ.Комплект.Товары КАК Компл
   |ПО  ЗаявкаНаПроизводствоТовары.Комплект.Ссылка = Компл.Ссылка    
   |ГДЕ
   |    ЗаявкаНаПроизводствоТовары.Ссылка = &ВыбДок)  КАК ЗаявкаПрКомплект";
   Запрос.УстановитьПараметр("ВыбДок",    ЭтотОбъект.Ссылка);     //Заявка на производство
   РезультатЗапроса = Запрос.Выполнить();
   
   СпособОбхода = ОбходРезультатаЗапроса.Прямой;
   ТабЗнач = РезультатЗапроса.Выгрузить(СпособОбхода);  
   
   Возврат ТабЗнач;    
   
КонецФункции // РасчетТребуемогоКоличестваТоваров()    

&НаКлиенте
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
   //{{__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
   // Данный фрагмент построен конструктором.
   // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
   Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ЗаявкаНаПроизводство") Тогда
       // Заполнение шапки
       Автор = глЗначениеПеременной("глТекущийПользователь");
       Исполнитель = ДанныеЗаполнения.Исполнитель;
       Заказчик = ДанныеЗаполнения.Контрагент;
       Производитель = ДанныеЗаполнения.Организация;
       Организация = ДанныеЗаполнения.Организация;
       Склад1 = ДанныеЗаполнения.СкладМатериалов;
       Склад2 = ДанныеЗаполнения.СкладСборки;
       ///-------------------------------------------------------------------------------------------------------
       // Заполнить с помощью запроса, выполняемого на сервере
       // табличную часть документа
       ТЗ = Новый ТаблицаЗначений;
       ТЗ = РасчетТребКолТов(ДанныеЗаполнения.Ссылка);    
       
   КонецЕсли;
   //}}__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
КонецПроцедуры
2 sidalexsandr
 
06.11.12
15:17
Ошибку нашел, Надо вместо &НаСервереБезКонтекста написать &НаСервере
3 sidalexsandr
 
06.11.12
15:19
Подскажите теперь правильно ли я сделал. Написал на сервере выполнить запрос и выгрузить его в таблицу значений, а уже из таблицы значений буду брать на клиенте данные и заполнять документ ?
4 Mort
 
06.11.12
15:19
Конечно неправильно
5 Mort
 
06.11.12
15:24
Чо это за директивы в модуле объекта?
6 vie_za
 
06.11.12
15:24
(4) мог бы подсказать ТС,куда ему рыть
7 Mort
 
06.11.12
15:27
1. Убрать директивы. Или это финт ушами для толстого клиента?
2. Функция РасчетТребКолТов получает параметр. Это тогда зачем:
Запрос.УстановитьПараметр("ВыбДок",    ЭтотОбъект.Ссылка);     //Заявка на производство
3. ТЗ = РасчетТребКолТов(ДанныеЗаполнения.Ссылка);  // ну тут дальше с ТЗ нужно что-то делать.
8 sidalexsandr
 
06.11.12
15:38
(7) В строке ошибка, исправил на:
Запрос.УстановитьПараметр("ВыбДок",    ЗаявкаПроизводство.Ссылка);     //Заявка на производство
9 sidalexsandr
 
06.11.12
15:39
(7) C ТЗ дальше делаю так
ТЗ = РасчетТребКолТов(ДанныеЗаполнения.Ссылка);
       Для каждого Стр Из ТЗ Цикл  
           НоваяСтрока = Товары.Добавить();
           //НоваяСтрока.ЕдиницаИзмерения = ТекСтрокаТовары.ЕдиницаИзмерения;
           НоваяСтрока.Номенклатура = Стр.КомплектующееНаименование;  
           НоваяСтрока.Количество = Стр.ТребуемоеКоличество;
           
       КонецЦикла;
10 sidalexsandr
 
06.11.12
15:41
(7) Подскажи про директивы. Что не так? Я написал директиву &НаСервере для того чтобы запрос выполнился на сервере и выгрузился в Таблицу значений. А дальше обрабатываю всё на клиенте.
11 Mort
 
06.11.12
15:50
(10) Это модуль объекта. На стороне тонкого клиента его тупо не существует. Посему директива &НаКлиенте тупо сделает процедуру невидимой в режиме тонкого клиента.
А что такое на серверебезконтекста в модуле объекта, я вообще сказать затрудняюсь.
Короче толк от директив в модуле объекта можно получить только занимаясь сурьезным онанизмом с вариантами работы в разных режимах.
12 Mort
 
06.11.12
15:52
В двух словах, не путай модуль формы и модуль объекта.
13 sidalexsandr
 
06.11.12
16:04
(11) Без контекста вот  нашел

&НаКлиенте (&AtClient) — определяет клиентскую процедуру (функцию);
&НаСервере (&AtServer) — определяет серверную процедуру (функцию);
&НаСервереБезКонтекста (&AtServerNoContext) — определяет серверную процедуру (функцию), исполняемую на сервере вне контекста формы. Переменные не могут быть внеконтекстными. В таких методах недоступен контекст формы (включая данные формы). Допустимыми являются вызовы только других внеконтекстных методов. При вызове этих методов не выполняется передача данных формы на сервер и обратно. Применение внеконтекстных методов позволяет существенно уменьшить объем передаваемых данных при вызове серверной процедуры из среды клиентского приложения;
&НаКлиентеНаСервереБезКонтекста (&AtClientAtServerNoContext) — определяет процедуру (функцию), исполняемую в модуле формы на клиенте и на сервере, не имеющую доступа к контексту формы, данным формы, переменным, но имеющую доступ к процедурам и функциям общих модулей – серверных, не глобальных и серверных и клиентских одновременно. Сама процедура (функция) доступна для клиентский, серверных контекстных и неконтекстных процедур и функций модуля формы. Из серверных внеконтекстных методов формы допускается вызов серверных методов общих модулей;
&НаКлиентеНаСервере (&AtClientAtServer) — определяет процедуру (функцию), исполняемую в модуле команды, выполняемую на клиенте и на сервере, имеющую доступ к процедурам и функциям общих модулей – серверных, не глобальных и серверных и клиентских одновременно, не имеющую доступ к переменным. Сама процедура (функция) доступна для клиентских серверных процедур и функций модуля команды.
Клиентская процедура (функция) исполняется в среде клиентского приложения. В такой процедуре доступен клиентский контекст формы и вызовы любых процедур модуля.

Серверная процедура (функция) исполняется в среде серверного приложения. В такой процедуре доступны данные формы, доступен серверный контекст формы и вызовы серверных и серверных внеконтекстных процедур модуля. При вызове такой процедуры данные формы будут передаваться  с клиента на сервер и обратно (по окончанию вызова).

Серверная процедура (функция), исполняемая вне контекста формы, (внеконтекстная) исполняется в среде серверного приложения. В такой процедуре (функции) недоступен контекст формы (включая данные формы). Допустимыми являются вызовы только других внеконтекстных процедур (функций). При вызове этих процедур (функций) не выполняется передача данных формы на сервер и обратно. Применение внеконтекстных процедур (функций) позволяет существенно уменьшить объем передаваемых данных при вызове серверной процедуры (функции) из среды клиентского приложения.

Отсутствие директивы компиляции перед процедурой (функцией) означает использование директивы по умолчанию. Директивой по умолчанию является &НаСервере. Не допускается использование нескольких директив компиляции перед одной процедурой (функцией). Не допускается наличие одноименных процедур (функций), отличающихся только директивами компиляции.

В модуле управляемой формы допускается использование инструкций препроцессору. Рекомендуется использовать инструкции препроцессора только внутри процедур (функций). Для понимания результата при "пересечении" инструкциями препроцессора границ процедур (функций) следует учитывать, что обработка инструкций препроцессора выполняется до обработки директив компиляции.

В модуле команды предопределенная процедура-обработчик ОбработатьКоманду должна предваряться директивой &НаКлиенте, так как выполнение команды происходит в клиентском приложении.

Модуль формы
В модуле формы доступны директивы компиляции – &НаКлиенте, &НаСервере, &НаСервереБезКонтекста, &НаКлиентеНаСервереБезКонтекста.
Модуль команды  В модуле команды доступны директивы компиляции – &НаКлиенте, &НаСервере, &НаКлиентеНаСервере.
Общий модуль  В общем модуле доступны директивы компиляции – &НаКлиенте, &НаСервере.
14 Mort
 
06.11.12
16:07
(13) Ну а я о чем. Про модуль объекта в справке ни слова, несмотря что эффект от директив в нём есть. Потому что не нужны они в нем.
15 sidalexsandr
 
06.11.12
16:39
Из справки выше:
Отсутствие директивы компиляции перед процедурой (функцией) означает использование директивы &НаСервере.
16 sidalexsandr
 
06.11.12
17:04
Вот ещё про директивы компиляции:http://forum.infostart.ru/forum26/topic58297/