Проверить наличие параметра в макете 1с
В 1С проверка на пустое значение осуществляется специальной функцией. Что бы проверить заполнен ли имеющийся у вас реквизит или переменная следует использовать функцию из глобального контекста ЗначениеЗаполнено().
В 1С 8 значение считается заполненным (не пустым) если оно отличается от значения по умолчанию для данного типа. Например для ссылочного типа значение по умолчанию — это Пустая ссылка (данного справочника, документа и т.п.). Также пустыми являются переменные и реквизиты содержащие значения Null и Неопределено.
1с проверка на пустое значение. Примеры
В данном случае переменная Проверка будет содержать значение Ложь. Также функцию ЗначениеЗаполнено(). можно использовать напрямую в условиях.
В данном примере, если документ Авансовый отчет с номером 000000001 существует, то в переменной Проверка будет содержаться значение Истина, иначе Ложь.
Использовать функцию ЗначениеЗаполнено нельзя для переменных мутабельных типов, таких как Таблица значений, Дерево значений и т.п. Функция работает для всех конфигураций.
Как же проверить, что в 1с таблица значений пустая? Для этого используется метод Количество(), с его помощью можно проверить сколько строк содержится в таблице значений.
Пример 3. Пусть МояТаблица — таблица значений определенная выше в коде.
Этим же методом можно определить заполненность дерева значений и выборки результата запроса.
Пример 4. Пусть МоеДерево — дерево значений определенное выше в коде.
Как видите, в дереве значений мы проверяем наличие строк первого уровня, если их нет, то дерево пустое.
Пример 5. Пусть Запрос — запрос к базе данных 1С 8, определенный выше.
На этом описание основных приемов, при помощи которых осуществляется в 1с проверка на пустое значение, закончено. Если вы хотите узнать, как сделать проверку на пустое значение в запросе, прочитайте следующие статьи: Проверка на null в запросе и Проверка на Неопределено в запросе
Маленькие хитрости работы с макетами печатных форм в конфигурациях, где БСП позволяет пользователю использовать изменённые макеты. Получение всех параметров общих макетов или макетов из файла mxl Написано на платформе 8.3.6.2363 в конфигурации БП 3.0.42.54 (привязки к БП 3.0 нет, просто текст примера передачи параметров из ПКО БП 3.0) 07.11.2015 - Версия 1.2 исправлена ошибка (не цеплялись параметры в последней ячейке макета), в таблице выделены строки с областями. 21.09.2021 - Версия 1.3 natalika1601 (спасибо за ошибку. ) заметила, что не работает, это исправленная версия
Маленькие хитрости передачи параметров в макеты печатных форм.
Без претензий на изобретение – тут ничего нового, просто накопилось, потому и решил написать эту заметку.
В БСП давно уже появился механизм замены макетов на пользовательские. В результате использования этого механизма периодически возникают клиенты, у которых (ну как водится - после обновления) перестал печататься приходный кассовый ордер (или что–то ещё, вспоминайте сами)…
Первый звонок от клиента на базовой БП вызвал лёгкое недоумение – ежели бы ошибка была в релизе, то шквал звонков был бы практически обеспечен, а тут тишина, только один, но …подключился, посмотрел – действительно, сваливается по ошибке:
В голове сразу мысля - «что за бред, не может быть и т. д. и т.п.»…но оказывается - может. Пользователи (они же юзвери), они ж такие затейники…вот кто их просил лезть в макеты и удалять там параметры, дабы заменить на свой, просто эксклюзивный текст, сохранить всё это безобразие, а потом гордо заявить, что опосля обновления (опять же, когда же ещё?) перестал печататься ПКО?
Первый раз непонятка полная, решается через сим-салабим отладчик (как вернуть стандартный макет - тема не этого романа), но возникает мысль: «А если не пользователю, а мне приспичит заменить стандартный параметр своим текстом, а параметр не нужен ни разу? Что делать?».
Решение – маленькая хитрость, параметр должен остаться в макете, но в печатную форму выводиться не должен. Путей решения увиделось два:
- первый: Спрятать параметр в ОЧЕНЬ узенькое поле макета (совсем не нравится, потом не сразу найдешь эту ячейку, коли понадобится);
- второй: вообще застраховать себя от подобных недоразумений, включив в ячейку ВСЕ возможные параметры, что встречаются в макете, где в свойстве «Заполнение» указать , что это шаблон. Причем ячейку можно не сужать до невозможности, а просто «накрыть» непрозрачной прямоугольной областью (в свойстве «Размещение» не забыть указать «Обрезать»):
Результат – можно писать любой текст, где захочется, главное, чтобы параметр остался в макете:
Дальше возникают всякие «вредные» мысли: если существует вероятность того, что макет может каким-либо «волшебным» образом измениться, зачем заставлять людей мучиться вытворением хитростей, типа описанной выше?
Если рисуем свою печатную форму и знаем, что с макетом может произойти всё, что угодно, то не стоит использовать конструкции вывода параметров типа:
Лучше собрать возможные параметры в структуру и заполнить параметры макета не несколько строк, как выше, а как то так:
Так гораздо проще, тем более, что главное - наличие или отсутствие параметров в макете не вызовет вылет программы по ошибке
Теперь, чтобы быстро использовать эти варианты с заполнением ячейки всеми параметрами формы или создания структуры, родилась идея использовать обработку, которая составит строку для шаблона ячейки параметров, или строку для создания фиксированной структуры для модуля печатной формы.
Параметры шаблона нужны для случаев, когда заполнением параметров напрямую (через структуру) управлять нельзя, например, конфигурация на поддержке, снимать нельзя в силу каких-то вполне объективных причин, а пользователю зачем-то нужно периодически менять макет.
Может быть ещё вариант – есть какой-то макет, в котором туча параметров, пропустить которые по недогляду вполне возможно, но очень не хотелось бы.
По итогам получилась обработка, в которую можно вывести все параметры общего маета, или макета из файла с итоговыми строками параметров и строки, для копипаста в текст конструктора структуры:
Может быть и другая ситуация – есть макет, там туча параметров, и не хочется пропустить какой-нибудь.
Добрый день, есть обработка в ней кроме форм присутствует макет с наименованием организаций и их счетов мне нужно из модуля формы этой обработки осуществить поиск в макете по наименованию организации и получить её счёт, как это можно сделать ?
(32) У вас по сути хардкодинг, так зачем усложнять себе жизнь макетами? Создайте соответствие (Наименование организации – Счет) прямо в коде.
Для управляемых форм, такой код набросал:
на форме кнопка на нее назначена команда. По нажатию на кнопку сообщается список параметров,которые есть в области макета
(32)В таком случае порекомендую посмотреть и скопировать себе работу с макетом из Классификатора ТНВЭД. Там тоже некоторые данные лежат в макете. Но поиск все равно не в макете, а в таблице, заполненной из макета.
В 1с есть варианты заполнения ячеек- это параметр,шаблон(т.е. не сколько параметров в одной ячейке) и текст. Вот мы их и заполняем в массив. Вот так в ячейках < параметр>. Вот так шаблон [что- то]. У меня выдало все параметры и шаблоны.
А самой организации в форме обработки нет? Вы в 1с ведете по нескольким организациям? Можно получить основную организацию, а потом её счет
(3)В форме пользователь выбирает организацию, я получаю её именование после должен провести поиск и получить её счёт который потом подставить куда нужно так мне кажется проще.
(27)У меня во внешней обработке макет со всей нужной инфой её нигде нет во всей конфе что предложите ? Было бы можно запихал бы всё в РегСвед и бед незнал бы.
(32) У вас по сути хардкодинг, так зачем усложнять себе жизнь макетами? Создайте соответствие (Наименование организации – Счет) прямо в коде.
(32)В таком случае порекомендую посмотреть и скопировать себе работу с макетом из Классификатора ТНВЭД. Там тоже некоторые данные лежат в макете. Но поиск все равно не в макете, а в таблице, заполненной из макета.
(1) Ничего не искать в макете.
1. Вставить свой фрагмент кода по определению счета, там где уже известна организация.
2. Вывести в табличный документ это значение.
(17)То что вы мне написали идти на сервер получать и искать в макете это я и без вас знал вопрос какие конструкции для этого использовать ?
(18) А я хз - вы же не говорите какого рода у вас макет. Вот какого рода макет используете - под него и конструкции соответствующие подбирайте. Или вы в самом деле решили устроить тут съезд телепатов?
Надеюсь, с получением самого макета на сервере уже справились?
(23) Ну и какие методы у нас есть для работы с табличным документом? Уже почитали данный вопрос в документации?
А чего так проще? Имея "организацию" можно получить все описание организации и адреса, банк, р/с, коды регистрации и т.д. И потом эти данные подставлять куда надо
(36) Ох тыж! На 36-й итерации наконец-то появляются какие-то интересные сведения! Телепатам теперь станет полегче!
Для управляемых форм, такой код набросал:
на форме кнопка на нее назначена команда. По нажатию на кнопку сообщается список параметров,которые есть в области макета
Универсальная замена метода "Свойство()"
Возможно у мноих из вас возникала задача проверять наличие определенного элемента на форме, или имеется ли на области макета нужный параметр. К сожалению, стандартных методов, позволяющих выполнить эту задачу, платформа не предоставляет.
Для значений типа "Структура" доступен метод "Свойство()":
Если же мы попытаемся таким же образом узнать о существовании какого-либо элемента формы или параметра на области макета (как пример), то это вызовет следующую ошибку:
По подробной информации об ошибке видно, что коллекция элементов управляемой формы (переменная "Элементы") не имеет метода "Свойство()". Тоже самое относится к абсолютому большинству коллекций, которые поддерживает платформа.
Для некоторых коллекций, таких как "КолонкиТабличногоПоля", "КоллекцияЭлементовМетаданных" для использования доступен метод "Найти()", в качестве первого параметра которому предеатеся имя элемента для поиска. Методы возвращают найденный элемент или "Неопределено", если значение не найдено. Таким образом, с помощью метода найти можно унать наличие того или иного свойства для тех коллекций, которые поддерживают работу с ним.
Но что делать, если коллекция не поддерживает работу с подобными методами, описанными выше. В таких случая нужен совсем иной способ работы с этими типами данных.
Сегодня в статье будет идти речь об универсальном подходе, позволяющим определить наличие свойства у значения любого типа данных 1С:Предприятие 8.x.
Как это реализовать
Предлагаю написать универсальную функцию для определения наличия свойства у любого типа значения и затем перейти к использованию ее на небольшом примере.
Работа предлагаемого подхода основывается на использовании метода "ЗаполнитьЗначенияСвойств()" и переменной с типом "Структура". На следующем листинге приведен програмный код данной функции:
В принципе все понятно из коментариев на листинге. Единственным моментом, на что следуюет обратить внимание, является то, что если свойство будет найдено, а его значение при этом равно NULL, то функция все равно скажет, что такого свойства нет. В таких случаях нужно создавать дополнительную проверку.
Практический пример
В качестве примера в тестовой конфигурации добавим документ "ТестовыйДокумент" с несколькими реквизитами. На его форму добавлены соответствующие элементы формы.
В поле "Имя элемента" вводится имя элемента формы. По кнопке найти отрабатывает созданная нами ранее функция. После выполнения команды, программа уведомляет пользователя об успешности поиска. На следующем листинге приведен программный код обработчика команды и вызываемая процедура поиска свойств.
Тестовую конфигурация Вы можете скачать по ссылке .
Подведем итог
Описанный в статье подход позволяет проверять наличия свойст в коллекциях любого типа. Элементы формы, коллекция метаданных, параметры макета и много другое. Отрицательного влияния на производительность не имеет. Работает на любой версии платформы.
P.S. По замечанию alcom привожу программный код с использованием GUID'а.
Определив объекты метаданных, занимающих большой объем можно лишние данные вычищать, внести изменения в конфигурацию или в бизнес процесс.
Маленькие хитрости работы с макетами печатных форм в конфигурациях, где БСП позволяет пользователю использовать изменённые макеты. Получение всех параметров общих макетов или макетов из файла mxl Написано на платформе 8.3.6.2363 в конфигурации БП 3.0.42.54 (привязки к БП 3.0 нет, просто текст примера передачи параметров из ПКО БП 3.0) 07.11.2015 - Версия 1.2 исправлена ошибка (не цеплялись параметры в последней ячейке макета), в таблице выделены строки с областями. 21.09.2021 - Версия 1.3 natalika1601 (спасибо за ошибку. ) заметила, что не работает, это исправленная версия
Маленькие хитрости передачи параметров в макеты печатных форм.
Без претензий на изобретение – тут ничего нового, просто накопилось, потому и решил написать эту заметку.
В БСП давно уже появился механизм замены макетов на пользовательские. В результате использования этого механизма периодически возникают клиенты, у которых (ну как водится - после обновления) перестал печататься приходный кассовый ордер (или что–то ещё, вспоминайте сами)…
Первый звонок от клиента на базовой БП вызвал лёгкое недоумение – ежели бы ошибка была в релизе, то шквал звонков был бы практически обеспечен, а тут тишина, только один, но …подключился, посмотрел – действительно, сваливается по ошибке:
В голове сразу мысля - «что за бред, не может быть и т. д. и т.п.»…но оказывается - может. Пользователи (они же юзвери), они ж такие затейники…вот кто их просил лезть в макеты и удалять там параметры, дабы заменить на свой, просто эксклюзивный текст, сохранить всё это безобразие, а потом гордо заявить, что опосля обновления (опять же, когда же ещё?) перестал печататься ПКО?
Первый раз непонятка полная, решается через сим-салабим отладчик (как вернуть стандартный макет - тема не этого романа), но возникает мысль: «А если не пользователю, а мне приспичит заменить стандартный параметр своим текстом, а параметр не нужен ни разу? Что делать?».
Решение – маленькая хитрость, параметр должен остаться в макете, но в печатную форму выводиться не должен. Путей решения увиделось два:
- первый: Спрятать параметр в ОЧЕНЬ узенькое поле макета (совсем не нравится, потом не сразу найдешь эту ячейку, коли понадобится);
- второй: вообще застраховать себя от подобных недоразумений, включив в ячейку ВСЕ возможные параметры, что встречаются в макете, где в свойстве «Заполнение» указать , что это шаблон. Причем ячейку можно не сужать до невозможности, а просто «накрыть» непрозрачной прямоугольной областью (в свойстве «Размещение» не забыть указать «Обрезать»):
Результат – можно писать любой текст, где захочется, главное, чтобы параметр остался в макете:
Дальше возникают всякие «вредные» мысли: если существует вероятность того, что макет может каким-либо «волшебным» образом измениться, зачем заставлять людей мучиться вытворением хитростей, типа описанной выше?
Если рисуем свою печатную форму и знаем, что с макетом может произойти всё, что угодно, то не стоит использовать конструкции вывода параметров типа:
Лучше собрать возможные параметры в структуру и заполнить параметры макета не несколько строк, как выше, а как то так:
Так гораздо проще, тем более, что главное - наличие или отсутствие параметров в макете не вызовет вылет программы по ошибке
Теперь, чтобы быстро использовать эти варианты с заполнением ячейки всеми параметрами формы или создания структуры, родилась идея использовать обработку, которая составит строку для шаблона ячейки параметров, или строку для создания фиксированной структуры для модуля печатной формы.
Параметры шаблона нужны для случаев, когда заполнением параметров напрямую (через структуру) управлять нельзя, например, конфигурация на поддержке, снимать нельзя в силу каких-то вполне объективных причин, а пользователю зачем-то нужно периодически менять макет.
Может быть ещё вариант – есть какой-то макет, в котором туча параметров, пропустить которые по недогляду вполне возможно, но очень не хотелось бы.
По итогам получилась обработка, в которую можно вывести все параметры общего маета, или макета из файла с итоговыми строками параметров и строки, для копипаста в текст конструктора структуры:
Может быть и другая ситуация – есть макет, там туча параметров, и не хочется пропустить какой-нибудь.
Читайте также: