Как выглядит код 1с

Обновлено: 04.07.2024

Язык 1С считается самым простым в изучении. Одно из его конкурентных преимуществ – возможность написания кода на русском, что значительно упрощает процесс его освоения. Хотя имеются и англоязычные варианты языка, предназначенные для внедрения на зарубежных предприятиях.

Программирование на 1С – создание алгоритма или программного кода, который позволяет пользователю без проблем работать в программном интерфейсе. Основной инструмент языка – команды (слова), которые в определённой последовательности создают общую функциональную оболочку программы. Команды бывают следующих видов:

3. Функции и процедуры;

Давайте разберём все их более детально.

Переменные

Допустим, имеется число 15. Это есть значение. Изначально оно нигде не сохраняется. Чтобы поместить её в информационную базу (ИБ) программы, необходимо выполнить сохранение в переменной, которая может именоваться хоть как, скажем, результат.

Переменная, которая относится к объекту 1С (поле справочника, допустим) и сохраняется в информационную базу – это реквизит. К любой переменной допускается присвоение разных типов данных: можно сначала присвоить тип «число», а затем – тип «строка». Но для реквизитов язык 1С предусматривает только один тип данных. Если указать в нём другое значение, допустим, вместо цифры – строку, то программа сначала попробует выполнить преобразование в цифровой формат. Если она не сможет это сделать, значение будет пустым.

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

Сложные переменные

Давайте разберём пример, когда переменной присвоено несколько значений.

По виду массив аналогичен колонке в Excel. Каждая ячейка – переменная, которая имеет только одно название. Чтобы перейти к определённой ячейке, нужно ввести её номер.

Ячейки в 1С нумеруются с 0, а не с 1.

Аналогичные ячейки, но с возможностью добавления комментария.

Древовидная таблица, самый простой пример – окно конфигурации.

Строки программы

В конце любой строчки стоит «;», а комментарий добавляется после знака «//». Значение пишется в кавычках, например «14». Если требуется ввести кавычку в значении, её пишут два раза: «14 ««o»»!».

Значение может быть разделено на две строки, для этого язык 1С имеет знак «|»:

Для указания специфических символов используется объект: «Символы.»:

Операторы

Это средства, встроенные в язык 1С. Используются для создания простейшей последовательности.

Те или иные строки выполняются при наличии необходимых условий.

Строчки выполняются установленное количество раз или пока выполняется определённое условие.

Для прерывания цикла язык 1С имеет команду «Прервать». Для прерывания только одной итерации – «Продолжить».

Объекты

Любой объект в 1С полноценен, то есть ему могут присваиваться уникальные от остальных методы и данные.

Для создания объекта используется параметр «Новый».

Для создания объектов применяются менеджеры. Их называют в соответствии с ветками конфигурации: Документы, Справочники и т.д. Методы в менеджере можно расширять:

Собственные объекты конфигурации 1С неизменяемы.

Ошибки в 1С

Программирование на 1С отличается тем, что при написании программы не всегда понятно, появится ли ошибка при выполнении той или иной строчки. Так, если во внешней обработке ввести:

и открыть её в базе, где указанного справочника нет – возникнет ошибка.

Чтобы она не выскочила, можно применять такой алгоритм:

Если при выполнении кода между «Попытка» и «Исключение» будет ошибка, то выполнение остановится и программа перейдёт к строчке между «Исключение» и «КонецПопытки». Если ошибка не появится, строчки выполняться не будут.

Функция ОписаниеОшибки() запускается только между «Исключение» и «КонецПопытки» и выдаёт сведения о содержании возникшей ошибки.

Функции и Процедуры

Данные методы предназначены для одноимённого наименования сразу нескольких строчек. Затем, при написании этого названия в тексте кода, будет активирована соответствующая функция. Функции и процедуры – это стандартные методы и обработчики в языке 1С:

Отличие функции от процедуры в том, что последняя не может вернуть значение, которое было посчитано при выполнении данных строк:

Как программировать?

Программирование на 1С подразумевает использование модулей. Найдя подходящий модуль, можно приступать к написанию своего кода.


// Описание типа строки:
НовСтрока = Новый ОписаниеТипов ( "Строка" );
// Описание строки с уточнением через квалификатор: максимальная длина строки = 50 символов
КвалификаторыСтроки = Новый КвалификаторыСтроки ( 50 );
НовСтрока_50 = Новый ОписаниеТипов ( "Строка" , , КвалификаторыСтроки );

// Описание типа числа:
НовЧисло = Новый ОписаниеТипов ( "Число" );
// Описание числа с уточнением через квалификатор: общее число разрядов = 14, число дробной части = 3
КвалификаторыЧисла = Новый КвалификаторыЧисла ( 14 , 3 , ДопустимыйЗнак . Любой );
НовЧисло_14_3 = Новый ОписаниеТипов ( "Число" , КвалификаторыЧисла );

// Описание типа даты:
НовДата = Новый ОписаниеТипов ( "Дата" );
// Описание даты с уточнением через квалификатор: храниться только дата, без времени
КвалификаторыДаты = Новый КвалификаторыДаты ( ЧастиДаты . Дата );
НовДата_БезВремени = Новый ОписаниеТипов ( "Дата" , , , КвалификаторыДаты );

// Описание типа булево:
НовБулево = Новый ОписаниеТипов ( "Булево" ); // Истина, Ложь

// Описание типа справочника:
НовНоменклатура = Новый ОписаниеТипов ( "СправочникСсылка.Номенклатура" );

// Описание типа перечисление:
НовСпособОплаты = Новый ОписаниеТипов ( "ПеречислениеСсылка.СпособыОплаты" );

// Описание типа документа:
НовДоговор = Новый ОписаниеТипов ( "ДокументСсылка.Договор" );

// Описание типа структуры:
НовСтруктура = Новый ОписаниеТипов ( "Структура" );

// Описание типа соответствия:
НовСоответствие = Новый ОписаниеТипов ( "Соответствие" );

// Описание типа массива:
НовМассив = Новый ОписаниеТипов ( "Массив" );

// Описание типа хранилище значения:
НовХранилищеЗначения = Новый ОписаниеТипов ( "ХранилищеЗначения" );

// Описание типа таблица значений:
НовТаблицаЗначений = Новый ОписаниеТипов ( "ТаблицаЗначений" );

// Описание типа список значений:
НовТаблицаЗначений = Новый ОписаниеТипов ( "СписокЗначений" );

// Описание типа картинки:
НовКартинка = Новый ОписаниеТипов ( "Картинка" );

// Описание типа уникального идентификатора:
НовУникальныйИдентификатор = Новый ОписаниеТипов ( "УникальныйИдентификатор" );

// Описание типа объекта метаданых:
НовОбъектМетаданных = Новый ОписаниеТипов ( "ОбъектМетаданных, Строка" );

// Описание составного типа (Например: строка+структура+справочник):
СписокМассив = Новый Массив ;
СписокМассив . Добавить ( "Строка" );
СписокМассив . Добавить ( "Структура" );
СписокМассив . Добавить ( "СправочникСсылка.Номенклатура" );
ОписаниеСоставногоТипа = Новый ОписаниеТипов ( СписокМассив );

Сколько же всего сложного и таинственного нас окружает.

Черные дыры и сновидения. Темная материя и подсознание. Корпускулярно-волновой дуализм и 1С.

И ведь думаешь, что знаешь эту "1Ску" как свои пять пальцев, но стоит случайно копнуть глубже. И очередная багофича. Да ешё и какая!

В этой статье рассмотрим секретный оператор ?

О нём мало кто знает, хоть он и существует как минимум с версии 8.0.


В последнее время я публикую на своём телеграм-канале разные хитрые задачки с подвохом для программистов 1С. Какие-то беру "по памяти", а какие-то "рождаю" в результате экспериментов. Об этом скоро выйдет отдельная статья. И вот в очередном тесте адекватности платформы случайно натыкаюсь на такую конструкцию:

Синтаксис-проверка прошла успешно. Никаких ошибок не высветилось. И, казалось бы, ошибка тогда должна произойти в момент выполнения.


Код успешно выполнился. Удивительно, но сработало! И тут меня понесло.


Как оказалось, знак ? ведёт себя крайне странно. Давайте посмотрим ещё раз прошлый пример.

Мы создаём новую переменную и назначаем ей значение - ?. И в переменной находится Неопределенно. И, казалось бы, это и есть ответ на вопрос. Знак ? означает Неопределено.

Но что же тогда это:


В данном коде сначала идёт объявление переменной "А". И в А установлено числовое значение "1". А далее идёт наше сравнение с ?. Если бы под знаком вопроса скрывалось Неопределено, то мы бы не попали внутрь условия. А по скрину видно, что попали.


Очень странная ошибка. "Переменная не определена (Сообщить)". Ну допустим. Добавим тогда такую переменную:

Данный код компилируется без ошибок. И при выполнении в 1С сообщает "ТЕСТ". То есть значение переменной Сообщить

Выходит, что символ ? указывает на предыдущее слово в коде. В данном случае, перед ? было слово Сообщить. И поэтому 1С изначально поругалась, что такая переменная не определена. А когда мы добавили переменную Сообщить, то всё стало на свои места.

То есть наш код для 1С выглядит так:

А теперь вернемся к нашим предыдущим примерам и разберём что и как сработало.

В данном коде предыдущее слово перед ? - Если. Но оно является ключевым для 1С. Как "Цикл", "Процедура" и так далее. Поэтому, его оператор ? не учитывает и берет в качестве источника значения переменную А.

Скорректируем же этот код так, как его видит 1С:

Теперь всё логично. А = А и поэтому условие выполняется.

А что с нашим самым первым примером?

На самом деле всё так же. Просто заменяем знак вопроса на предыдущее слово.

Да, такой код тоже странный, но в рамках 1С всё логично. Сначала объявляется переменная и в ней Неопределено. А затем происходит присвоение переменной значения из её самой. То есть опять же Неопределено. Можете проверить такой код - это хоть и выглядит странно, но работает. А почитать чуть подробнее можно в статье на ИТС: МояПеременная = 0; МояПеременная = ? + 1; //1 МояПеременная = ? + 1; //2 МояПеременная = ? * 5; //10 МояПеременная = ? / 2; //5 МояПеременная = ? - 6; //-1

А самое интересное, что такая возможность существовала как минимум ещё с версии 8.0 . Специально скачал старую платформу и проверил.

На самом деле такой код можно ещё упросить:

Но такой вариант становится менее надежным. Ведь всё работает до тех пор, пока перед ? находится МояПеременная. Если же вставить после этого какое-то другое "слово", то всё порушится.

Но вот ещё пример:

Мы же помним, что знак ? берет предыдущее слово. Так вот в нашей строке кода это слово "А". Именно так - без "Структура".

Поэтому 1С в таком коде вместо знака вопроса вставит "А"

Но зато появляется новая возможность применения:

В данном коде мы создали структуру и наполнили её объявленными ранее переменными. Тоже бывает удобно, когда нужно передать какой-то набор переменных метода в другой метод через структуру.

А вот ещё пример. Можно передать в какой-то метод или конструктор одно значение несколько раз:

Передавать знак ? можно даже в условный тернарный оператор. Например, этот код приводит отрицательные числа к 0:

А этот приводит отрицательные числа к положительным:

Подобным образом можно присваивать дефолтные значения необязательным параметрам:

Главное помнить, что знак ? берет именно предыдущее слово, поэтому вот так работать НЕ будет:

1С поругается, что Переменная не определена (Структура). Ведь перед последним знаком ? слово Структура

Но что если использовать символ ? в параметрах?

Сделаем процедуру с параметром ? :

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

Но мы можем сделать его необязательным:

И параметр не обязан быть единственным. Можно делать разными способами:

А можно использовать Знач

Но вот незадача, ? в параметре метода не использует предыдущее слово (как во всех других случаях). Как обратиться к этому параметру - неизвестно.

В стеке вызовов он отображается:


А попробуем добавить второй параметр ?

1С ругается так:

Формальный параметр с указанным именем уже определен (?)

Опираясь на текст ошибки, мы можем предположить, что 1С объявляет параметр с именем "?"

И когда мы пытаемся добавить ещё один такой параметр, то платформа ругается.

Как обратиться к параметру с именем "?" - неизвестно. Методы Вычислить() и Выполнить() не помогли.

Но, возможно, это всё те вопросы, которые нам ещё предстоит разгадать. Секреты и загадки этой таинственной платформы под кодовым названием 1С.


Понравилась статья?

Поставьте лайк плюс. Пишите свои идеи и комментарии по теме. Статья будет дополняться.

Во встроенном языке 1С используется динамическая типизация переменных, т.е. при объявлении переменной в коде невозможно указать для нее допустимые типы значений. Тип значения переменной гарантированно становится известен только во время выполнения присвоения ей значения. Это придает языку простоту освоения, лаконичность, легкость и гибкость, но приносит с собой и сложности. К ним в частности относится вычисление типа значения выражения в режиме разработки (design-time), без чего не будут работать многие важные помощники при написании и анализе кода

Помощники опирающиеся на вычисление типа

1 Контекстная подсказка (автодополнение) (Ctrl+Space)


2 Подсказка по параметрам метода (Ctrl+Shift+Space)

3 Переход к определению (F12)


Принцип работы вычислителя типов режима разработки

  1. Определяется текущее выражение в тексте модуля
  2. Выделяются все переменные и функции, от которых оно зависит
  3. Для каждой переменной выполняется поиск выше по тексту присвоения ей выражения
  4. Для каждой функции выполняется анализ типа возвращаемого ею значения. В конфигураторе 1С это к большому сожалению реализовано только для системных функций, но EDT это реализовано и для прикладных функций.
  5. Для каждого присвоения повторяются шаги 2-4

На платформе 1С 7.7 штатного вычислителя типов в режиме разработки не было. Но благодаря Орефкову Александру появилось стороннее API конфигуратора OpenConf. На базе него было сделано расширение с вычислением типов Телепат, которое стало прорывом в удобстве редактирования кода.

На платформе 1С 8.0 в конфигураторе появился свой вычислитель типов, но с заметно более скудными возможностями, чем Телепат 7.7 . Он НЕ умеет вычислять тип результата прикладной функции, колонки таблицы/дерева значений и многое другое, что умел Телепат 7.7. Позже появился сторонний API конфигутора Снегопат от того же Орефкова Александра. Но на его базе насколько мне известно так и не появилось расширения для продвинутого вычисления типа.

Привыкая к помощникам, опирающимся на вычислитель типов, начинаешь испытывать дискомфорт в случаях, где вычислителю не удается определить типы. Например при вызове автодополнения на иллюстрации


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

Но можно заставить вычислитель режима разработки думать, что переменная имеет нужный тип, написав не исполняемый код присвоения этой переменной выражения с легко вычисляемым нужным типом.

Способ №1

Лучшим способом для конфигуратора 1С 8 является вставка всегда удаляемой инструкции препроцессора. Такой код всегда не будет компилироваться и потому не будет влиять на скорость компиляции и исполнения кода.

Пример 1. Нужно указать переменной Алгоритм тип СправочникСсылка.ирАлгоритмы

Теперь будет работать контекстная подсказка у выражения, зависящего только от этой переменной:


Пример 2. Нужно указать переменной Отбор тип ОтборКомпоновкиДанных

Способ №2

Другим способом для конфигуратора 1С 8 является вставка всегда не исполняемого кода через всегда ложное условие. Такой код будет компилироваться. Исполняться (вычисляться) будет только выражение условия "Ложь", но не код внутри ветки Тогда. Здесь хотя и очень незначительное, но есть влияние на скорость компиляции и исполнения кода.

Пример 1. Нужно указать переменной Алгоритм тип СправочникСсылка.ирАлгоритмы

Шаблоны текста для вспомогательных инструкций

Чтобы не набирать каждый раз вручную эти длинные конструкции, разумно добавить себе шаблон текста

Шаблон для способа 1

Шаблон для способа 2

Если Ложь Тогда
<?>
КонецЕсли;

Ссылки на методы

Иногда в коде приходится использовать ссылки на методы, т.е. не вызывать метод сразу, а передавать ссылку на него куда то, где его уже будут вызывать. На момент написания статьи в объектной модели 1С ссылки на методы поддерживаются в

  1. ФоновыеЗадания.Выполнить(<ПолноеИмяМетода>. )
  2. Новый ОписаниеОповещения(<ИмяМетода>, <Модуль>. )
<ОбъектИнтерфейсаПользователя>.УстановитьДействие(. <ИмяМетода>) В таких случаях в конфигураторе 1С не сработает команда "Перейти к определению" и потому переходить к определению метода приходится вручную. Тут тоже помогут вспомогательные инструкции. В них нужно указать вызов нужного метода и в любой момент можно будет переходить к нему командой "Перейти к определению".


Недостатки

  1. Из-за того, что эти вспомогательные инструкции не относятся к полезной логике программы, они затрудняют чтение кода и даже могут привести читателя кода в замешательство, если он не знаком с этим приемом.
  2. При переходе к определению переменной (F12) редактор будет активизировать нашу вспомогательную строку для присвоения типа. Нужно будет еще раз выполнить команду перехода (F12), чтобы перейти к настоящему определению.

Про EDT

На горизонте 1С появился EDT (Enterprise development tools) - новая среда разработки, которая по задумке должна стать лучше конфигуратора во всем, кроме задач администрирования. Там в частности реализован более умный чем в конфигураторе 1С 8 вычислитель, который должен превзойти Телепат 7.7. К сожалению описанные выше способы не будут работать с поумневшим вычислителем типов EDT. Он сразу понимает, что этот код не будет выполняться и потому не учитывает такой код при вычислении типов. Зато в EDT предусмотрена возможность гибко описывать типы параметров и возвращаемых значений методов для вычислителя типов. Выглядит это примерно так


Я пытался донести до разработчиков EDT потребность указывать типы в любом месте кода, но пока не был услышан.

Читайте также: