1с обращение к процедуре объекта как к функции свернуть
&НаКлиенте
Процедура ЗаполнитьПодразделения (НомерПриложения)
ЭтотОбъект [СтрШаблон ("Подразделения%1", НомерПриложения)]. Очистить ();
СтрПоОрганизации = ЭтотОбъект [СтрШаблон ("Подразделения%1", НомерПриложения)]. Добавить ();
СтрПоОрганизации. НаимЮЛ = "По организации";
СтрПоОрганизации. ИтогоПоПоставкам = ПересчетИтогов6и7(НомерФормы);
//
Для Каждого СтрПодразделения Из Отчет [СтрШаблон ("ТЧПодразделения%1", НомерПриложения)] Цикл
СтрПодразделенияНаФорме = ЭтотОбъект [СтрШаблон ("Подразделения%1", НомерПриложения)]. Добавить ();
ЗаполнитьЗначенияСвойств (СтрПодразделенияНаФорме, СтрПодразделения);
КонецЦикла;
КонецПроцедуры
Ошибка в "СтрПоОрганизации. ИтогоПоПоставкам = ПересчетИтогов6и7(НомерФормы); "
Вот сама процедура:
&НаКлиенте
Процедура ПересчетИтогов6и7(НомерФормы)
ТабличнаяЧасть = ?(НомерФормы = "6", Отчет. ТЧ6_Поставки, Отчет. ТЧ7_Закупки);
ТабличнаяЧастьЭлементы = ?(НомерФормы = "6", Элементы. ТЧ6_Поставки, Элементы. ТЧ7_Закупки);
Для Каждого стрТЧ1 Из ТабличнаяЧасть Цикл
Если ТабличнаяЧастьЭлементы. ДанныеСтроки (стрТЧ1.ПолучитьИдентификатор ()) = Неопределено Тогда
Продолжить;
КонецЕсли;
Сумма = Сумма + ТабличнаяЧастьЭлементы. ДанныеСтроки (стрТЧ1.ПолучитьИдентификатор ()).П000000000021;
КонецЦикла;
Если НомерФормы = "6" Тогда
Элементы. ТЧ6_ПоставкиП000000000021.ТекстПодвала = Формат (Сумма, "ЧЦ=15; ЧДЦ=5");
ИначеЕсли НомерФормы = "7" Тогда
Элементы. ТЧ7_ЗакупкиП000000000021.ТекстПодвала = Формат (Сумма, "ЧЦ=15; ЧДЦ=5");
КонецЕсли;
ТабличнаяЧасть = ?(НомерФормы = "6", Отчет. ТЧ6_Возвраты, Отчет. ТЧ7_Возвраты);
ТабличнаяЧастьЭлементы = ?(НомерФормы = "6", Элементы. ТЧ6_Возвраты, Элементы. ТЧ7_Возвраты);
Для Каждого стрТЧВозвраты Из ТабличнаяЧасть Цикл
Если ТабличнаяЧастьЭлементы. ДанныеСтроки (стрТЧВозвраты. ПолучитьИдентификатор ()) = Неопределено Тогда
Продолжить;
КонецЕсли;
Сумма = Сумма + ТабличнаяЧастьЭлементы. ДанныеСтроки (стрТЧВозвраты. ПолучитьИдентификатор ()).П000000000021;
КонецЦикла;
Если НомерФормы = "6" Тогда
Элементы. ТЧ6_ВозвратыП000000000021.ТекстПодвала = Формат (Сумма, "ЧЦ=15; ЧДЦ=5");
ИначеЕсли НомерФормы = "7" Тогда
Элементы. ТЧ7_ВозвратыП000000000021.ТекстПодвала = Формат (Сумма, "ЧЦ=15; ЧДЦ=5");
КонецЕсли;
Вам надо определиться:
1. у вас ПересчетИтогов6и7() - это функция, тогда первая процедура без изменений, а вот функция все-таки функция
Функция ПересчетИтогов6и7(НомерФормы)
.
Возврат ЧтоХотитеВернуть;
КонецФункции
2. у вас ПересчетИтогов6и7() - это процедура, тогда вторая процедура без изменений, а вот обращаться к ней надо как к процедуре
Процедура ЗаполнитьПодразделения (НомерПриложения)
.
ПересчетИтогов6и7(НомерФормы);
.
КонецПроцедуры
Т. е. если из процедуры хотите получить какое-то значение, то это функция:
ИмяПеременной = ИмяФункции ();
и в самой функции должно быть "Функция" и строка Возврат.
Если вам надо просто пойти в другую процедуру, там пошуршать и вернуться обратно, то никаких равно при ее вызове:
кодкодкод
ВыполнитьПроцедуру ();
кодкодкод
Ковыряя одну конфу от Раруса, обратил внимание, что очень много параметров процедур и функций в общих модулях описаны с использованием ключевого слова Знач. Такое описание делается даже в тех случаях, когда 100% с данные только читаются (т.е. исключено изменение объекта).
Подумалось следующее. А не фича ли это?
Ведь Знач (в случае передачи ссылки) на уровне СУБД по сути одним запросом выберет копию объекта и передаст в процедуру/функцию, где уже можно спокойно с ней работать, без дергания сервера мелкими запросами при обращении к свойствам объекта по ссылке.
Прав ли я или тут закопан какой-то другой смысл?
В-четвёртых, использование ключевого слова Знач при объявлении параметров процедур и функций. Дело в том, что при клиент-серверном взаимодействии это ключевое слово значит совсем не то, что при работе внутри одного компьютера, клиентского или серверного. Когда мы используем Знач при объявлении параметра серверной процедуры и вызываем её с клиента, это означает, что значение этого параметра обратно на клиент не приедет. Если же мы не устанавливаем Знач, а стандартно так и есть, то происходит следующее. Допустим, мы вызываем серверную процедуру и передаём в неё массив. Предположим, что на клиенте мы даже не собираемся потом этим массивом пользоваться. Он просто был параметром и на самом деле нам не нужен больше. Но когда серверный вызов закончится, массив будет упакован в XML или JSON (на веб-клиенте), и уедет обратно на клиент. Понятно, что это совсем неэффективно. Поэтому если вам не нужно возвращаемое значение, переданное через параметр, пишите ключевое слово Знач у таких параметров. Конечно, если параметр Булево, Знач можно сэкономить и не писать. Но по сути это нехорошо.
(0) Я бы не стал конфу от раруса рассматривать, как объект для подражания. Смотрел УАТ, так в шоке был от увиденного.
Значит в клиент-серверном варианте, если передавать через Знач ссылку на, к примеру элемент справочника, то в процедуру/функцию все равно придет ссылка, а не копия объекта элемента справочника?
Первый - сугубо идеологический. Указывая "Знач" вы явно объявляете свое намерение сделать параметр строго входным (обязуетесь не изменять параметр)
Любой человек, который ваш код будет читать, может посмотреть на сигнатуру метода и сказать: "так, эти два параметра входные, а вот этот без "Знач" - выходной, он где-то в коде присваивается и в нем что-то возвращается". То есть, указывая знач, вы облегчаете чтение своего кода и явно объявляете намерения в сигнатуре метода.
Второй аспект - технический. При передаче чего-то на сервер, если параметр без слова "Знач", то платформа считает этот параметр выходным и при возврате на клиента будет обратно передавать его значение. Указывая Знач вы оптимизируете трафик.
а по поводу копии объекта, это вы не понимаете что такое ссылка. Ссылка это просто GUID. Ее можете передавать с сервера на клиент и обратно, никаких копий "объектов" не создается.
СправочникОбъект на сервер передать вообще нельзя, это мутабельное значение.
Когда вы пишете "А = Ссылка.Наименование" происходит запрос в СУБД и в память поднимается ВЕСЬ объект вместе со всеми табличными частями. Передавая ссылку на сервер вы передаете только GUID. Эти два процесса (запрос в базу и передача ссылки) вообще не связаны никак.
(11) А, ну понял. Меня просто СП сбил с толку.
Получается если мы передаем ссылку на элемент справочника, то без Знач передаем ссылку на ссылку, вернее указатель на ссылку. А со Знач само значение ссылки.
(12) %) Я Ничего Не Понял
Если мы передаем со Знач или без Знач ссылку, то мы передаем GUID. Ссылка в базе данных и Ссылка на объект в памяти это как бы разные ссылки, не находите?
Вот здесь будет переход с машины на машину (с клиента на сервер). Параметр передается "по ссылке". Поскольку это две разных машины, то у них никак не может быть общая память. Платформа здесь делает следующее:
1. Передает значение 0 на сервер (по сути делает копию переменной А)
2. На сервере устанавливается некой переменной значение 1
3. При возврате на клиента платформа помнит, что передача должна быть "как бы по ссылке" и присваивает в А значение, установленное на сервере.
Теперь, если поменять код и вместо &НаКлиенте написать &НаСервере, то будет следующее:
1. В метод ПоСсылке будет передан условный адрес переменной А, по этому адресу записано значение
2. В точке вызова будет видно, что А стало равно единице.
Я, собственно, к чему. Не думайте про ссылки, как про указатели. Если происходит переход с одной машины на другую, то в любом случае будет задействована сериализация туда и обратно. Слово Знач указывает на то каким должно быть НАБЛЮДАЕМОЕ поведение в коде. Технически это могут быть более сложные вещи.
(0) Знач не имеет никакого отношения к СУБД
(6) ИМХО там в большинстве случаев параметры передаются по значению, скорее передаче по ссылке является исключением.
Использование знач для ссылок приводит к созданию новой ссылки то есть другого обьекта с типом ссылка
(16) "Использование знач для ссылок приводит к созданию новой ссылки то есть другого обьекта с типом ссылка" - какие-нибудь подтверждения этому тезису есть?
В документации сказано, что агрегаты передаются всегда по ссылке.
(17) "По ссылке" означает, что если вы перезапишете переменную внутри функции, то она изменится и в точке вызова.
Если "По Значению", то в точке вызова останется то же значение.
Если передали "По значению" коллекцию, внутри метода вызвали Очистить(), то в точке вызова она тоже будет очищена. Вы не перезаписали переменную коллекции, а вызвали метод, который изменил внутренности объекта. Т.е. агрегат (коллекция) как бы ни передавался - если вы меняете состояние объекта - оно меняется везде.
Вот правда вы как школьники.
Это же основы программирования.
С Знач копия объекта создается в процедуре и там же умирает.
Без Знач- передается ссылка(и это может быть ссылка на объект с возможностью изменения) . Вот тут возможны варианты когда работать или не будет или не оптимально.
Вот не знаю как там внутре 1С, некоторые другие языки создают копию объекта только в момент изменения. Если вы понимаете о чем я.
Но на самом деле это не имеет значения.
Хотя изредка очень хочется, чтобы про типобезопасность и имьютабилити платформа "думала" сама.
В контексте ветки внимание, вопрос: зачем нужна такая функция:
На ИТС есть же статья "Передача параметров по ссылке и по значению при вызове процедур и функций"? Там всё подробно разжёвано.
Есть документ "Отчёт о расходе материалов" и в нём есть таблица Расшифровка, в которой располагаются следующие реквизиты: Изделие, Материал, Объём_работ, Норма_на_1_изд.,Всего_по_норме.
Нужно сложить количество материала израсходованного по норме (Всего_по_норме), то есть, если в колонке Материалы попадаются материалы с одинаковым названием, то их расход по норме суммируется. У меня что-то вообще нет никаких мыслей как это можно сделать. Помогите пожалуйста.
Если речь о 7.7, то
Свернуть(,);
Синтаксис:
Свернуть(,)
Назначение:
Позволяет свернуть таблицу значений по соответствующим значениям колонок, т.е. заменяет на одну строку все дублирующие (по значениям группировочных колонок) строки, суммируя значения по суммируемым колонкам.
Параметры:
- группировочные колонки (номера или идентификаторы колонок через запятую), по которым группировать данные.
- суммируемые колонки (номера или идентификаторы колонок через запятую), по которым суммировать данные.
Guest11
Guest11
Для каждого рас из Расшифровка цикл
плс=Всего.Добавить();
рез=Расшифровка.Свернуть("Материалы","Всего_Н,Отклонение");
плс.Материал=рез.Материалы;
плс.Рас_по_Норм=рез.Всего_Н;
плс.Отклонение=Рез.Отклонение;
КонецЦикла;
Попробовала так, просто результат должен отображаться в другой таблице. На что мне выдаётся: Обращение к процедуре объекта как к функции (Свернуть). Как же тогда это реализовать?
Всё, решила проблему, осенило! :lol:
Только, а вот если нам нужно найти одинаковые элементы таблиц в двух разных документах, то это как сделать?
unknown181538
Только, а вот если нам нужно найти одинаковые элементы таблиц в двух разных документах, то это как сделать?
Только, а вот если нам нужно найти одинаковые элементы таблиц в двух разных документах, то это как сделать?
Guest11
Что такое таблица в документе? о_О Табличная часть документа, тут по-моему нетрудно догадаться что это.
Потом собираюсь сравнить их с другим документом и, если в одном из них какого-то элемента нет, то вывести втабличной части третьего документа Вот так всё запутанно.
unknown181538
Что такое таблица в документе? о_О Табличная часть документа, тут по-моему нетрудно догадаться что это.
Нельзя так и написать? Мне вот кажется, что таблица документа это скорее таблица значений, в которую выгрузили таб. часть.
насколько я понял тебе скорее нужно обходить одну табличку, искать каждую стоку в другой таблице и редультаты выгружать в третьюю. т.е.что то типа:
Для каждого СТР из ТаблицаСоЗначениями цикл
Если ВтораяТаблицаСоЗначениями.НайтиЗначение();//погляди синтаксис только
Пока ВтораяТаблицаСоЗначениями.НайтиЗначение();
//запись значений в третью таблицу
КонецЦикла;
КонецЕсли;
КонецЦикла;
puh14
Эххх - может знатоки подскажут - есть ли в восьмерке что-то вроде UNION JOIN ? Тогда один масенький запрос с двумя параметрами -и получи что надо.
блин. конечно есть. что-то я проморгал что разговор о восьмерке.. был занят. Конечно можно сделать все запросом. и на выходе получать уже только нужные сроки
Guest11
Дело в том, что поиск идёт по разным документам. Я пробовала создать запрос, но 1с8 ругалось и ничего из этого не получалось
Попробую сделать как KiR выше описал.
А вообще дело вот в чём, если подробно разбираться:
есть, допустим, три документа: Остаток материалов (подразделение,материал,остаток),Требование-накладная (материал, количество) - он же документ, по которуму считается приход материалов, Инвентаризационная опись (материал, количество) - фиксирует количество материала в цехе на конец периода.
Вот надо, чтобы в 4-ойтаблице выводились все материалы, что есть в этих документах и, если материалы совпадают, то остаток на начало, приход и остаток на конец выводился. Если же какой-то материал не встречается в одном из документов - он добавлялся и выводилось тоже самое, только со значением 0 в том или ином количественном параметре (остаток на начало, приход, остаток на конец), смотря в какой таблице нет его.
Я просила пример для двух таблиц, чтобы понять механизм как это делается, для трёх, думаю потом как-нибудь сообразила бы. Но если кто может конкретно для моего случая сказать как сделать, то я буду примного благодарна.
vitfil
d1 - табличная часть первого документа
d2 - табличная часть второго документа
tovar - реквизит, который будет одинаковым в обоих документах.
puh14
Блин - фанат join-ов. Можно и без них - но они таки быстрее
Выбрать Различные Накладная.Номенклатура
из документ.Расходнаянакладная Как Накладная
Где Номенклатура не в (Выбрать Различные Накладная1.Номенклатура
из документ.Расходнаянакладная Как Накладная1 где Накладная1.ссылка = &Ссылка1) и Накладная.Ссылка = &Ссылка
Невнимательно прочитал пост
есть, допустим, три документа: Остаток материалов (подразделение,материал,остаток),Требование-накладная (материал, количество) - он же документ, по которуму считается приход материалов, Инвентаризационная опись (материал, количество) - фиксирует количество материала в цехе на конец периода.
Вот надо, чтобы в 4-ойтаблице выводились все материалы, что есть в этих документах и, если материалы совпадают, то остаток на начало, приход и остаток на конец выводился. Если же какой-то материал не встречается в одном из документов - он добавлялся и выводилось тоже самое, только со значением 0 в том или ином количественном параметре (остаток на начало, приход, остаток на конец), смотря в какой таблице нет его.
Я просила пример для двух таблиц, чтобы понять механизм как это делается, для трёх, думаю потом как-нибудь сообразила бы. Но если кто может конкретно для моего случая сказать как сделать, то я буду примного благодарна.
тебе тогда скорее надо выбрать номенклатуру из трех документов ( или партии, если у тебя партионный учет), свернуть это дело по нужному полю и сделать через вирт. таб. ОстаткиИОбороты запрос к регистрам, в которых хранится остаток. Добавление тут происходит при свертке таблицы, а вот
Привожу ещё одну любопытную реализацию задачи по свёртке значений в разных объектах 1С. Итак, чтобы свернуть значения таблицы, массива или строки можно воспользоваться одной из предложенных ниже функций:
- СвернутьСтроку(Стр, СтрНачальныйРазделитель, СтрИтоговыйРазделитель) – Убирает повторяющиеся в строке значения. Значения разделены между собой указанным разделителем. Также можно поменять этот разделитель после преобразования.
- СвернутьМассив(пМассив) – Убирает повторяющиеся в массиве значения.
- СвернутьТаблицу(Таб, ИсключаяПоля, ПоляСуммы, СуммироватьВсеЧисла) – Убирает повторяющиеся значения в таблице. Процедура аналогична методу ТаблицаЗначений.Свернуть(КолонкиГруппировок, КолонкиСуммирования).
Реализация функций в 1С следующая:
1. Функция «Свернуть строку».
// Сворачивает в строке используемые повторяющиеся значения. // // Параметры: // Стр - - Исходная строка; // СтрНачальныйРазделитель - - Разделитель для разбора строки, по умолчанию ","; // СтрИтоговыйРазделитель - - Разделитель, используемый в собранной строке. // По умолчанию ",". // // Возвращаемое значение: // - Собранная строка. // Функция СвернутьСтроку(Стр, СтрНачальныйРазделитель = ",", СтрИтоговыйРазделитель = ", ") Экспорт Результат = ""; МассивСтр = РазобратьСтрокуВМассивПоРазделителю(Стр, СтрНачальныйРазделитель); ЗаполненныйМассив = Новый Массив; Для Каждого Элемент Из МассивСтр Цикл Если ЗаполненныйМассив.Найти(Элемент) = Неопределено Тогда ЗаполненныйМассив.Добавить(Элемент); Результат = Результат + СтрИтоговыйРазделитель + Элемент; КонецЕсли; КонецЦикла; Результат = Сред(Результат, СтрДлина(СтрИтоговыйРазделитель)+1); Возврат Результат; КонецФункции;
2. Функция «Свернуть массив».
// Сворачивает в массиве повторяющиеся значения. // // Параметры: // пМассив - - Исходный массив. // // Возвращаемое значение: // - Свёрнутый массив. // Функция СвернутьМассив(пМассив) Экспорт Если пМассив.Количество() > 1 Тогда ТЗ = Новый ТаблицаЗначений; ИмяКолонки = "Колонка1"; ТЗ.Колонки.Добавить(ИмяКолонки); Для Индекс = 0 По пМассив.Количество()-1 Цикл ТЗ.Добавить(); КонецЦикла; ТЗ.ЗагрузитьКолонку(пМассив, ИмяКолонки); ТЗ.Свернуть(ИмяКолонки, ""); Возврат ТЗ.ВыгрузитьКолонку(ИмяКолонки); Иначе Результат = Новый Массив; Для Каждого Элемент Из пМассив Цикл Результат.Добавить(Элемент); КонецЦикла; Возврат Результат; КонецЕсли; КонецФункции;
3. Процедура «Свернуть таблицу». Отличается от процедуры по умолчанию тем, что сворачивает все поля за исключением указанных и имеет дополнительную возможность распознавать колонки с числами.
// Сворачивает в таблице повторяющиеся значения. // // Параметры: // Таб - - Исходная таблица; // ИсключаяПоля - - Колонки таблицы, исключаемые из рассмотрения; // ПоляСуммы - - Поля для суммирования строк; // СуммироватьВсеЧисла - - Команда на суммирование всех колонок с числами (поля добавляются к полям суммы). // Процедура СвернутьТаблицу(Таб, ИсключаяПоля = "НомерСтроки", ПоляСуммы = "", СуммироватьВсеЧисла = Ложь) Экспорт МассивИсключаяПоля = ?(ИсключаяПоля = "", Новый Массив, ПреобразоватьВМассив(ИсключаяПоля)); Если СуммироватьВсеЧисла Тогда МассивПоляСуммы = Новый Массив; Для Каждого Колонка Из Таб.Колонки Цикл МассивТипов = Колонка.ТипЗначения.Типы(); Если МассивТипов.Найти(Тип("Число")) <> Неопределено И (МассивТипов.Количество() = 1 ИЛИ (МассивТипов.Количество() = 2 И (МассивТипов.Найти(Тип("Null")) <> Неопределено ИЛИ МассивТипов.Найти(Тип("Неопределено")) <> Неопределено)) ИЛИ (МассивТипов.Количество() = 3 И МассивТипов.Найти(Тип("Null")) <> Неопределено И МассивТипов.Найти(Тип("Неопределено")) <> Неопределено)) Тогда ПоляСуммы = ?(ПустаяСтрока(ПоляСуммы), "", ПоляСуммы + ", ") + Колонка.Имя; МассивПоляСуммы.Добавить(Колонка.Имя); КонецЕсли; КонецЦикла; Иначе МассивПоляСуммы = ?(ПоляСуммы = "", Новый Массив, ПреобразоватьВМассив(ПоляСуммы)); КонецЕсли; СтрКолонки = ""; Для Каждого Колонка Из Таб.Колонки Цикл Если МассивПоляСуммы.Найти(Колонка.Имя) = Неопределено И МассивИсключаяПоля.Найти(Колонка.Имя) = Неопределено Тогда СтрКолонки = СтрКолонки + ", " + Колонка.Имя; КонецЕсли; КонецЦикла; СтрКолонки = Сред(СтрКолонки, 3); Таб.Свернуть(СтрКолонки, ПоляСуммы); КонецПроцедуры;
Также в данном коде используются следующие вспомогательные функции:
- ПреобразоватьВМассив(Объект, Проверка) – Преобразует объект в массив.
- РазобратьСтрокуВМассивПоРазделителю(Стр, СтрРазделитель, ИгнорироватьПустые) – Разбирает предложенную строку в массив.
Код вспомогательных функций на 1С:
// Преобразует в массив переменную любого типа данных. // // Параметры: // Объект - Произвольный - произвольный объект данных; // Проверка - - Осуществление проверки на заполненное значение. // // Возвращаемое значение: // - Массив с теми же данными. // Функция ПреобразоватьВМассив(Объект, Проверка = Ложь) Экспорт ОбъектМассив = Новый Массив; Если НЕ Проверка ИЛИ ЗначениеЗаполнено(Объект) Тогда Если ТипЗнч(Объект) = Тип("Массив") Тогда ОбъектМассив = Объект; ИначеЕсли ТипЗнч(Объект) = Тип("СписокЗначений") Тогда ОбъектМассив = Объект.ВыгрузитьЗначения(); ИначеЕсли ТипЗнч(Объект) = Тип("Строка") Тогда ОбъектМассив = РазобратьСтрокуВМассивПоРазделителю(Объект); ИначеЕсли ТипЗнч(Объект) = Тип("Структура") Тогда Для Каждого Элемент Из Объект Цикл ОбъектМассив.Добавить(Элемент.Значение); КонецЦикла; Иначе ОбъектМассив.Добавить(Объект); КонецЕсли; КонецЕсли; Возврат ОбъектМассив; КонецФункции; // Разбирает строку в массив подстрок по разделителю. // При этом пробелы между подстроками не учитываются. // // Параметры: // Стр - исходная строка; // СтрРазделитель - разделитель, по умолчанию ","; // ИгнорироватьПустые - игнорировать ли пустые места между разделителями. // // Возвращаемое значение: // Массив строк // Функция РазобратьСтрокуВМассивПоРазделителю(Знач Стр, СтрРазделитель = ",", ИгнорироватьПустые = Ложь) Экспорт Результат = Новый Массив; ВхождениеРазделителя = Найти(Стр, СтрРазделитель); Пока ВхождениеРазделителя <> 0 Цикл ЧастьДоРазделителя = СокрЛП(Лев(Стр, ВхождениеРазделителя - 1)); Если НЕ (ИгнорироватьПустые И ПустаяСтрока(ЧастьДоРазделителя)) Тогда Результат.Добавить(ЧастьДоРазделителя); КонецЕсли; Стр = СокрЛП(Сред(Стр, ВхождениеРазделителя + 1)); ВхождениеРазделителя = Найти(Стр, СтрРазделитель); КонецЦикла; Если НЕ (ИгнорироватьПустые И ПустаяСтрока(Стр)) Тогда Результат.Добавить(СокрЛП(Стр)); КонецЕсли; Возврат Результат; КонецФункции;
Смело используйте эти и другие функции для реализации своих проектов. Удачи!
Если вам понравилась эта статья или у вас к ней есть замечания, напишите об этом, пожалуйста, в комментариях ниже.
Существует множество статей, которые описывают возможные причины возникновения в 1С ошибки “Поле объекта не обнаружено”. Порой это связывают с обновлением платформы, обновлением типового релиза, или с какими-то другими причинами.
Мы же будем оперировать фактами. В конце статьи прилагается внешняя обработка, в которой воспроизведена данная ошибка.
- Удалили табличную часть, к которой обращаемся в коде?
- Переименовали реквизит, а в коде не исправили?
- Заменили значение со ссылки на неопределено?
Вуаля – платформа выдаст ошибку “Поле объекта не обнаружено”!
Индекс находится за границами массива
- Использование при обходе коллекции количества элементов вместо индекса. Индексы начинаются с нуля, а количество элементов – с единицы. Поэтому следующий код гарантированно приведет к ошибке: Массив[Массив.Количество()]
- Последствия удаления элементов из коллекции, очистки коллекции или замены коллекции на пустую
- Ошибочное увеличение счетчика в цикле “Для”
Обращение к процедуре как к функции
Суть этой ошибки в том, что процедура не может возвращать значение. И если мы в коде используем вызов процедуры справа от знака присваивания, это приведет к ошибке.
Данная ошибка имеет две вариации – если используется стандартная процедура из методов какого-нибудь объекта, то фраза будет звучать “Обращение к процедуре объекта как к функции”. Если же использовать процедуру, объявленную в коде, то текст ошибки будет “Обращение к процедуре как к функции”.
При этом ошибка использования процедуры объекта является ошибкой времени выполнения – т.е. на этапе сохранения и проверки конфигурации платформа эту ошибку не обнаружит.
А вот неправильное использование процедуры синтаксическая проверка (Ctrl + F7) успешно обнаруживает, и не даст сохранить конфигурацию или внешнюю обработку/отчет, пока ошибка не будет устранена.
Рассмотрим два примера:
1. Воспроизведем ошибку “ Обращение к процедуре как к функции” . При этом платформа не даст сохранить изменения, т.к. не проходит синтакс-контроль.
2. Воспроизведем ошибку “ Обращение к процедуре объекта как к функции” . Здесь мы неверно используем метод объекта массива “Добавить”, который является процедурой.
Процедура не может возвращать значение
Переменная не определена
Такой текст ошибки платформа 1С выдает на этапе синтаксического контроля, при сохранении конфигурации, внешнего отчета или обработки.
Причин у этой ошибки может быть несколько.
- Опечатка в имени переменной
- Обращение к переменной, которая нигде в области видимости не объявлена (неявной инициализацией с присвоением значения, явным образом с использованием ключевого слова “Перем”, или передана в качестве параметра)
- Написание на клиенте серверного кода. Например, обращение к менеджеру справочников “Справочники”, и т.п. Клиентская часть приложения “не видит ” серверные объекты языка
- Также ошибка может появиться, если ранее код использовался в режиме толстого клиента, но после был запущен в тонком клиенте.
Внимательно следить за правильностью набранного кода, своевременно объявлять переменные или передавать их в качестве параметров. Писать серверный код только в серверных модулях, а также использовать соответствующие инструкции препроцессора, например “&НаСервере”.
Читайте также: