Какому ключевому слову в языке запросов 1с соответствуют два варианта в английском варианте
Если вы похожи на меня, то согласитесь: SQL — это одна из тех штук, которые на первый взгляд кажутся легкими (читается как будто по-английски!), но почему-то приходится гуглить каждый простой запрос, чтобы найти правильный синтаксис.
А потом начинаются джойны, агрегирование, подзапросы, и получается совсем белиберда. Вроде такой:
Буэ! Такое спугнет любого новичка, или даже разработчика среднего уровня, если он видит SQL впервые. Но не все так плохо.
Легко запомнить то, что интуитивно понятно, и с помощью этого руководства я надеюсь снизить порог входа в SQL для новичков, а уже опытным предложить по-новому взглянуть на SQL.
Не смотря на то, что синтаксис SQL почти не отличается в разных базах данных, в этой статье для запросов используется PostgreSQL. Некоторые примеры будут работать в MySQL и других базах.
В SQL много ключевых слов, но SELECT , FROM и WHERE присутствуют практически в каждом запросе. Чуть позже вы поймете, что эти три слова представляют собой самые фундаментальные аспекты построения запросов к базе, а другие, более сложные запросы, являются всего лишь надстройками над ними.
Давайте взглянем на базу данных, которую мы будем использовать в качестве примера в этой статье:
У нас есть книжная библиотека и люди. Также есть специальная таблица для учета выданных книг.
- В таблице "books" хранится информация о заголовке, авторе, дате публикации и наличии книги. Все просто.
- В таблице “members” — имена и фамилии всех записавшихся в библиотеку людей.
- В таблице “borrowings” хранится информация о взятых из библиотеки книгах. Колонка bookid относится к идентификатору взятой книги в таблице “books”, а колонка memberid относится к соответствующему человеку из таблицы “members”. У нас также есть дата выдачи и дата, когда книгу нужно вернуть.
Давайте начнем с простого запроса: нам нужны имена и идентификаторы (id) всех книг, написанных автором “Dan Brown”
Запрос будет таким:
А результат таким:
id | title |
---|---|
2 | The Lost Symbol |
4 | Inferno |
Довольно просто. Давайте разберем запрос чтобы понять, что происходит.
3.1 FROM — откуда берем данные
Сейчас это может показаться очевидным, но FROM будет очень важен позже, когда мы перейдем к соединениям и подзапросам.
FROM указывает на таблицу, по которой нужно делать запрос. Это может быть уже существующая таблица (как в примере выше), или таблица, создаваемая на лету через соединения или подзапросы.
3.2 WHERE — какие данные показываем
WHERE просто-напросто ведет себя как фильтр строк, которые мы хотим вывести. В нашем случае мы хотим видеть только те строки, где значение в колонке author — это “Dan Brown”.
3.3 SELECT — как показываем данные
Теперь, когда у нас есть все нужные нам колонки из нужной нам таблицы, нужно решить, как именно показывать эти данные. В нашем случае нужны только названия и идентификаторы книг, так что именно это мы и выберем с помощью SELECT . Заодно можно переименовать колонку используя AS .
Весь запрос можно визуализировать с помощью простой диаграммы:
4. Соединения (джойны)
Теперь мы хотим увидеть названия (не обязательно уникальные) всех книг Дэна Брауна, которые были взяты из библиотеки, и когда эти книги нужно вернуть:
Title | Return Date |
---|---|
The Lost Symbol | 2016-03-23 00:00:00 |
Inferno | 2016-04-13 00:00:00 |
The Lost Symbol | 2016-04-19 00:00:00 |
По большей части запрос похож на предыдущий за исключением секции FROM . Это означает, что мы запрашиваем данные из другой таблицы. Мы не обращаемся ни к таблице “books”, ни к таблице “borrowings”. Вместо этого мы обращаемся к новой таблице, которая создалась соединением этих двух таблиц.
borrowings JOIN books ON borrowings.bookid=books.bookid — это, считай, новая таблица, которая была сформирована комбинированием всех записей из таблиц "books" и "borrowings", в которых значения bookid совпадают. Результатом такого слияния будет:
А потом мы делаем запрос к этой таблице так же, как в примере выше. Это значит, что при соединении таблиц нужно заботиться только о том, как провести это соединение. А потом запрос становится таким же понятным, как в случае с «простым запросом» из пункта 3.
Давайте попробуем чуть более сложное соединение с двумя таблицами.
Теперь мы хотим получить имена и фамилии людей, которые взяли из библиотеки книги автора “Dan Brown”.
На этот раз давайте пойдем снизу вверх:
Шаг Step 1 — откуда берем данные? Чтобы получить нужный нам результат, нужно соединить таблицы “member” и “books” с таблицей “borrowings”. Секция JOIN будет выглядеть так:
Результат соединения можно увидеть по ссылке.
Шаг 2 — какие данные показываем? Нас интересуют только те данные, где автор книги — “Dan Brown”
Шаг 3 — как показываем данные? Теперь, когда данные получены, нужно просто вывести имя и фамилию тех, кто взял книги:
Супер! Осталось лишь объединить три составные части и сделать нужный нам запрос:
First Name | Last Name |
---|---|
Mike | Willis |
Ellen | Horton |
Ellen | Horton |
Отлично! Но имена повторяются (они не уникальны). Мы скоро это исправим.
Грубо говоря, агрегирования нужны для конвертации нескольких строк в одну. При этом, во время агрегирования для разных колонок используется разная логика.
Давайте продолжим наш пример, в котором появляются повторяющиеся имена. Видно, что Ellen Horton взяла больше одной книги, но это не самый лучший способ показать эту информацию. Можно сделать другой запрос:
Что даст нам нужный результат:
First Name | Last Name | Number of books borrowed |
---|---|---|
Mike | Willis | 1 |
Ellen | Horton | 2 |
Почти все агрегации идут вместе с выражением GROUP BY . Эта штука превращает таблицу, которую можно было бы получить запросом, в группы таблиц. Каждая группа соответствует уникальному значению (или группе значений) колонки, которую мы указали в GROUP BY . В нашем примере мы конвертируем результат из прошлого упражнения в группу строк. Мы также проводим агрегирование с count , которая конвертирует несколько строк в целое значение (в нашем случае это количество строк). Потом это значение приписывается каждой группе.
Каждая строка в результате представляет собой результат агрегирования каждой группы.
Можно прийти к логическому выводу, что все поля в результате должны быть или указаны в GROUP BY , или по ним должно производиться агрегирование. Потому что все другие поля могут отличаться друг от друга в разных строках, и если выбирать их SELECT 'ом, то непонятно, какие из возможных значений нужно брать.
В примере выше функция count обрабатывала все строки (так как мы считали количество строк). Другие функции вроде sum или max обрабатывают только указанные строки. Например, если мы хотим узнать количество книг, написанных каждым автором, то нужен такой запрос:
author | sum |
---|---|
Robin Sharma | 4 |
Dan Brown | 6 |
John Green | 3 |
Amish Tripathi | 2 |
Здесь функция sum обрабатывает только колонку stock и считает сумму всех значений в каждой группе.
Подзапросы это обычные SQL-запросы, встроенные в более крупные запросы. Они делятся на три вида по типу возвращаемого результата.
6.1 Двумерная таблица
Есть запросы, которые возвращают несколько колонок. Хороший пример это запрос из прошлого упражнения по агрегированию. Будучи подзапросом, он просто вернет еще одну таблицу, по которой можно делать новые запросы. Продолжая предыдущее упражнение, если мы хотим узнать количество книг, написанных автором “Robin Sharma”, то один из возможных способов — использовать подзапросы:
author | sum |
---|---|
Robin Sharma | 4 |
6.2 Одномерный массив
Запросы, которые возвращают несколько строк одной колонки, можно использовать не только как двумерные таблицы, но и как массивы.
Допустим, мы хотим узнать названия и идентификаторы всех книг, написанных определенным автором, но только если в библиотеке таких книг больше трех. Разобьем это на два шага:
1. Получаем список авторов с количеством книг больше 3. Дополняя наш прошлый пример:
author |
---|
Robin Sharma |
Dan Brown |
Можно записать как: ['Robin Sharma', 'Dan Brown']
2. Теперь используем этот результат в новом запросе:
title | bookid |
---|---|
The Lost Symbol | 2 |
Who Will Cry When You Die? | 3 |
Inferno | 4 |
Это то же самое, что:
6.3 Отдельные значения
Бывают запросы, результатом которых являются всего одна строка и одна колонка. К ним можно относиться как к константным значениям, и их можно использовать везде, где используются значения, например, в операторах сравнения. Их также можно использовать в качестве двумерных таблиц или массивов, состоящих из одного элемента.
Давайте, к примеру, получим информацию о всех книгах, количество которых в библиотеке превышает среднее значение в данный момент.
Среднее количество можно получить таким образом:
И это можно использовать в качестве скалярной величины 3 .
Теперь, наконец, можно написать весь запрос:
Это то же самое, что:
bookid | title | author | published | stock |
---|---|---|---|---|
3 | Who Will Cry When You Die? | Robin Sharma | 2006-06-15 00:00:00 | 4 |
7. Операции записи
Большинство операций записи в базе данных довольно просты, если сравнивать с более сложными операциями чтения.
7.1 Update
Синтаксис запроса UPDATE семантически совпадает с запросом на чтение. Единственное отличие в том, что вместо выбора колонок SELECT 'ом, мы задаем знаения SET 'ом.
Если все книги Дэна Брауна потерялись, то нужно обнулить значение количества. Запрос для этого будет таким:
WHERE делает то же самое, что раньше: выбирает строки. Вместо SELECT , который использовался при чтении, мы теперь используем SET . Однако, теперь нужно указать не только имя колонки, но и новое значение для этой колонки в выбранных строках.
7.2 Delete
Запрос DELETE это просто запрос SELECT или UPDATE без названий колонок. Серьезно. Как и в случае с SELECT и UPDATE , блок WHERE остается таким же: он выбирает строки, которые нужно удалить. Операция удаления уничтожает всю строку, так что не имеет смысла указывать отдельные колонки. Так что, если мы решим не обнулять количество книг Дэна Брауна, а вообще удалить все записи, то можно сделать такой запрос:
7.3 Insert
Пожалуй, единственное, что отличается от других типов запросов, это INSERT . Формат такой:
Где a , b , c это названия колонок, а x , y и z это значения, которые нужно вставить в эти колонки, в том же порядке. Вот, в принципе, и все.
Взглянем на конкретный пример. Вот запрос с INSERT , который заполняет всю таблицу "books":
8. Проверка
Мы подошли к концу, предлагаю небольшой тест. Посмотрите на тот запрос в самом начале статьи. Можете разобраться в нем? Попробуйте разбить его на секции SELECT , FROM , WHERE , GROUP BY , и рассмотреть отдельные компоненты подзапросов.
Вот он в более удобном для чтения виде:
Этот запрос выводит список людей, которые взяли из библиотеки книгу, у которой общее количество выше среднего значения.
Full Name |
---|
Lida Tyler |
Надеюсь, вам удалось разобраться без проблем. Но если нет, то буду рад вашим комментариям и отзывам, чтобы я мог улучшить этот пост.
Когда программисты первый раз видят прикладной язык 1С, многие впадают в ступор. Несмотря на то, что родной русский язык в любом случае ближе и понятнее, читать код на русском языке и понимать, что происходит в нем (когда это в новинку) не так-то просто.
Опытный программист сразу увидит определенные знакомые конструкции (условия, циклы, вызовы функций), но многие моменты в коде все равно будут непонятными и непривычными. А уж если код был написан программистом с даром красивого именования переменных и функций, то процесс первого знакомства с 1С обещает быть еще более ярким. Впрочем, последнее справедливо не только для 1С.
Пример кода от любителя красивого синтаксиса
Сейчас процесс перевода 1С на английский язык идет полным ходом. К существующим ранее решениям (таким как 1C:Drive) недавно добавился 1С:ERP World Edition, а разработка на английском языке (более привычном и понятном для многих начинающих или не связанных с 1С программистов) стала еще более актуальной.
Как же человеку, уже прикипевшему к русскому языку в коде и / или со знаниями английского на уровне «London is the capital of Great Britain… Microsoft…Coca-Cola…Ok» быстро перестроиться на кодирование на английском языке?
Есть несколько способов:
1. Первое и самое банальное – подтянуть знания английского языка. Даже если удастся запомнить, как писать все нужные конструкции, названия объектов и переменных все равно желательно давать понятными англоговорящему кодеру. И чтобы не сидеть все время в обнимку с гугл-переводчиком, лучше потратить некоторое время на освоение нового языка, благо ресурсов сейчас для этого предостаточно.
Вот пример кода, как не нужно делать:
2. Второй способ – открыть любую типовую конфигурацию и искать название на английском нужной конструкции с помощью синтаксис-помощника. Как правило, там это название будет приведено подобным образом:
Пример типовой конфигурации
3. Ну и третий способ – воспользоваться материалом данной статьи, где я приведу примеры наиболее популярных конструкций в стандартном виде и их аналогов на английском языке.
Рассмотрим основные нормы применения и оформления программного кода 1С. Соблюдение данных правил обязательно для получения сертификата 1С:Совместимо.
Общие требования к конфигурации
Для типизированных объектов метаданных, хранящихся в информационной базе, настоятельно рекомендуется не использовать тип ЛюбаяСсылка. Состав типов того или иного типизированного объекта должен определяться явным образом.
Для типизированных объектов метаданных строкового типа рекомендуется использовать переменную длину строки. Свойство «Фиксированная длина» может устанавливаться только в тех случаях, когда действительно необходимо при манипуляции этими данными иметь гарантию, что строка имеет определенную длину, даже несмотря на наличие концевых пробелов.
Подчиненные объекты метаданных, такие как реквизиты, измерения, формы, располагаются в дереве метаданных в соответствии с проектной логикой.
Для оптимизации тех или иных отчетов или для оптимизации выполнения отбора и сортировки в формах списков возможно использование индексирования. При этом индексирование следует использовать сдержанно, так как увеличение числа индексов приводит к дополнительной нагрузке на систему при записи данных и увеличивает объем базы данных.
Имя, синоним комментарий
Многократное выполнение запросов
Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания - попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>
Рекомендуется получать все необходимые однотипные данные одним запросом вместо выполнения серии запросов.
Проверка на пустой результат выполнения запросов
Проверку того, что результат выполнения запроса не содержит строк, следует выполнять с помощью метода Пустой(). Поскольку на получение выборки из результата запроса (выгрузка его в таблицу значений) будет затрачиваться дополнительное время.
Оформление текстов запросов
Использование строк неограниченной длины
Для хранения строк, максимально возможная длина которых заведомо известна, используются строковые реквизиты с длиной, равной максимально возможной.
Когда максимально возможная длина строки неизвестна, для хранения используются строковые реквизиты неограниченной длины.
При этом следует помнить о некоторых ограничениях, возникающих при использовании полей неограниченной длины в языке запросов.
Программное управление формой
В разделе инициализации модуля формы запрещается открывать другие формы или диалоги (например, операторами Вопрос(), Предупреждение() и т. д.).
Программное управление формой из других модулей производится через присвоение её реквизитам (свойствам) значений и через вызов её методов или экспортных процедур (функций).
Не допускается делать предположения о свойствах реквизитов формы.
Обращение к данным информационной базы в обработчиках часто вызываемых событий
Следует минимизировать обращение к данным информационной базы в обработчиках событий, приведенных ниже, поскольку это может существенно замедлить интерактивную работу.
События табличного поля:
В качестве средств минимизации в зависимости от ситуации могут быть:
Требования по локализации модулей
Для этого необходимо применять функцию НСтр() вместо прямого использования строковых литералов. Иное использование строк, предназначенных для пользовательского интерфейса, не допускается.
В том случае, если строка является составной и включает в себя части, зависящие от тех или иных условий, настоятельно рекомендуется использовать логически завершенные, целостные фразы. Для формирования переменной составляющей строки при этом необходимо применять замену подстрок по определенным правилам. При этом можно использовать как функцию СтрЗаменить, так и предусмотреть в конфигурации специально предназначенную для этого функцию.
В функции НСтр() строка ограничивается символами одинарных кавычек.
Такое требование обусловлено частым использованием двойных кавычек в строковых литералах.
В том случае, если все же применяется не замена строк в строке-шаблоне, а сложение строк, то неязыковые символы (пробелы, табуляция и пр.) в начале и конце строк необходимо выделять в отдельные строковые литералы.
Правильно:
В редких случаях строковые литералы из текстов запросов также могут оказаться частью пользовательского интерфейса. В таких случаях строковые литералы необходимо выносить из текста запроса в параметры.
Тексты модулей
Тексты модулей должны быть написаны на русском языке.
Размер табуляции стандартный (4 символа).
Программные модули не должны иметь неиспользуемых процедур и функций.
Программные модули не должны иметь закомментированных фрагментов кода.
Текст модуля должен быть оформлен синтаксическим отступом. Для синтаксического отступа используется табуляция.
С крайней левой позиции должны начинаться только:
Процедуры НачатьТранзакцию() и ЗафиксироватьТранзакцию() не являются операторными скобками, поэтому текст внутри этих процедур не сдвигается.
При длине строки более 120 символов следует использовать переносы. Строки более 120 символов делать не рекомендуется, за исключением тех случаев, когда перенос невозможен.
Тексты модулей должны содержать комментарии.
Небольшие комментарии пишутся в конце строки, которую комментируют, например:
Большие комментарии или комментарии к фрагменту кода пишутся перед комментируемым кодом в отдельной строке.
Структура модулей
В программном модуле в общем случае могут присутствовать следующие разделы в приведенной ниже последовательности:
- заголовок модуля;
- раздел описания переменных;
- процедуры и функции модуля;
- обработчики событий элементов формы;
- обработчики событий;
- раздел инициализации.
Некоторые разделы могут присутствовать только в модулях определенного вида. Например, обработчики событий элементов форм могут присутствовать только в модулях форм, а раздел описания переменных и раздел инициализации не могут быть определены в неглобальных общих модулях, модулях менеджеров объектов, наборов записей, значений констант и модуле сеанса.
Заголовок модуля
Заголовок модуля представляет собой комментарий в самом начале модуля.
В заголовке модуля приводится его краткое описание и условия применения.
Для общих модулей заголовок является обязательным.
Раздел описания переменных
Экспортные переменные модуля должны быть снабжены комментарием, достаточным для понимания их назначения. Для не экспортных переменных наличие комментария желательно, но не обязательно.
Комментарий рекомендуется размещать в той же строке, где объявляется переменная.
Процедуры и функции модуля
Процедуры и функции, которые не являются обработчиками событий, размещаются сразу же после описания переменных. Процедуры и функции, связанные между собой по характеру работы или логике работы, рекомендуется располагать вместе.
Обработчики событий элементов формы
После процедур и функций в модуле формы располагают обработчики событий элементов формы. Рекомендуется обработчики одного элемента формы располагать вместе, придерживаясь при этом порядка их следования в описании встроенного языка.
У каждого события должен быть свой обработчик. Если одинаковые действия должны выполняться при возникновении событий в разных элементах формы, следует:
- создать отдельную процедуру (функцию), выполняющую необходимые действия;
- для каждого элемента формы создать отдельный обработчик с именем, назначаемым по умолчанию;
- из каждого обработчика вызвать требуемую процедуру (функцию).
Обработчики событий
Последними из процедур располагаются обработчики событий модуля (формы, объекта, менеджера объекта и т.д.). Для них также рекомендуется придерживаться порядка следования, приведенного в описании встроенного языка.
Раздел инициализации
Раздел инициализации содержит операторы, инициализирующие переменные модуля или объект (форму).
Описание процедур и функций
Процедуры и функции рекомендуется комментировать.
Обязательного комментирования требуют экспортные процедуры и функции.
Прочие процедуры и функции, в том числе обработчики событий, рекомендуется комментировать, если требуется пояснить назначение процедуры (функции) или особенности её работы. Если процедура (функция) не сложна для понимания и ее назначение и порядок работы следуют из ее названия и имен формальных параметров, комментарий можно не писать. Следует избегать комментариев, не дающих дополнительных пояснений о работе процедуры (функции).
Комментарий размещается перед объявлением процедуры(функции) и имеет следующий формат:
Содержит словесное краткое описание назначения и/или принципов работы процедуры(функции).
Исключение составляют функции, которые предназначены только для проверки истинности некоторого факта и которые возвращают в качестве результата проверки значение типа Булево.
Имена таких функций образуются из написания проверяемого факта.
Например, если функция должна проверить, что в переданной строке присутствуют только цифры, то она может называться ТолькоЦифрыВСтроке().
Описание процедур и функций должны отделятся друг от друга в тексте модуля пустыми строками.
Правила образования имен переменных
Имена переменных следует образовывать от терминов предметной области таким образом, чтобы из имени переменной было понятно ее назначение.
Имена следует образовывать путем удаления пробелов между словами. При этом каждое слово в имени пишется с прописной буквы. Предлоги и местоимения из одной буквы также пишутся прописными буквами.
Имена переменных запрещается начинать с подчеркивания.
Имена переменных не должны состоять из одного символа. Использование коротких имен переменных допускается только для счетчиков циклов.
Переменные, отражающие состояние некоторого флага, следует называть так, как пишется истинное значение этого флага.
Перенос выражений
Длинные арифметические выражения переносятся следующим образом:
- в одной строке может находиться более одного операнда;
- при переносе знаки операции пишутся в начале строки (а не в конце предыдущей строки);
- операнды выравниваются по началу первого операнда, без учета знаков операций.
При необходимости параметры процедур, функций, методов могут переноситься следующим образом:
Сложные логические условия в Если…ИначеЕсли…КонецЕсли могут переноситься следующим образом:
- каждое элементарное условие может начинать новую строку:
- логические операторы И, ИЛИ ставятся в начале строки, а не в конце предыдущей строки;
- все условия выравниваются по началу первого условия, без учета логического оператора;
- ключевое слово Тогда пишется на той же строке, что и последнее условие.
Определение типа значения переменной
Определение типа значения переменной необходимо выполнять путем его сравнения с типом, а не каким-либо другим методом.
Правильно:
Получение метаданных объектов
Сортировка таблиц значений
В тех случаях, когда для таблицы значений применяется сортировка по колонкам, содержащим ссылочные значения, необходимо учитывать, что при этом для каждой из этих колонок для всех строк таблицы значений системой будет выполнено обращение к информационной базе за представлением этой ссылки.
Поэтому для таблиц с большим количеством (несколько сотен и тысяч) строк, особенно в алгоритмах, критических ко времени исполнения, рекомендуется сразу, на этапе заполнения, добавлять в таблицу дополнительные колонки с представлениями и сортировку выполнять уже по ним. Если, конечно, это не вызовет аналогичных многократных обращений к информационной базе.
Использование объекта РегистрСведенийМенеджерЗаписи
Чтение записи (набора записей) из регистра сведений без последующей модификации необходимо выполнять запросом.
Во всех остальных случаях объект РегистрСведенийМенеджерЗаписи следует применять только тогда, когда выполнение операций с регистром сведений требует использования отбора одновременно по всем измерениям. При этом менеджер записи использует для выполнения записи два набора записей, устанавливая им соответствующие значения отборов. Поэтому обработчики событий набора записей вызываются и тогда, когда для записи данных используется менеджер записи.
Копирование строк между таблицами значений произвольной структуры
При копировании строк между различными таблицами значений (табличными частями и т.п.) со схожим составом колонок следует использовать метод глобального контекста ЗаполнитьЗначенияСвойств().
Алгоритмы, использующие данный метод, значительно эффективнее, например, многократного перебора колонок таблицы значений, выполняемого для получения их состава.
Получение представлений для ссылочных значений в табличном документе
Поэтому в качестве параметров следует указывать сами представления.
Исключением могут быть случаи, когда для получения представлений придется выполнять аналогичное многократное обращение к базе данных.
Это может приводить к увеличению времени выполнения запроса (и как следствие, общего времени формирования итогового документа), а при большом количестве типов – к невозможности его выполнения в клиент-серверной версии из-за ограничения Microsoft SQL Server, по которому в запросе не может участвовать больше 256 таблиц. Такие случаи также могут быть исключением для данного правила, в них представления для ссылочных значений допускается получать в момент их вывода в табличный документ.
Поскольку однозначно рекомендовать, какой из способов получения представлений следует выбрать, нельзя, такой выбор должен делаться разработчиком самостоятельно, на основании данных, полученных экспериментально.
Программное создание прикладных объектов
Для программного создания прикладных объектов следует использовать методы соответствующих менеджеров (СоздатьЭлемент(), СоздатьДокумент(), СоздатьНаборЗаписей() и т.д.)
Для программного создания прикладных объектов, у которых существует соответствующие менеджеры объектов, использование конструктора (оператор встроенного языка Новый) запрещается.
Особенности контекстного выполнения на сервере и в режиме внешнего соединения
При разработке кода общего модуля и модулей объектов, которые должны быть доступны на сервере и во внешнем соединении, следует соблюдать следующие правила:
1. Запрещено использование объектов, имеющих тип данных, недоступный на сервере и во внешнем соединении:
- ТабличныйДокумент
- ТекстовыйДокумент
- ДиалогВыбораФайла
- все другие типы, использование которых невозможно на сервере 1С:Предприятие и во внешнем соединении.
2. Запрещено использование средств, отвечающих за диалог с пользователем:
- Предупреждение()
- Вопрос()
- методы работы с формами и прочие, для которых специально указано (в документации), что они не доступны на сервере и/или во внешнем соединении.
3. Запрещается вызов экспортных процедур других общий модулей, у которых не установлен признак компиляции на сервере и/или во внешнем соединении.
4. Участки кода, в которых используются конструкции, не доступные на сервере или во внешнем соединении, должны выделяться соответствующими инструкциями препроцессору, например:
5. При написании кода модулей объектов, которые исполняются на сервере или доступны во внешнем соединении, недопустимо использовать переменные, процедуры и функции, которые определены в модуле обычного приложения и в модуле управляемого приложения.
6. Для сервера: Надо учитывать, что при передаче управления с клиента на сервер, а также в обратную сторону, существует ограничение на тип передаваемых параметров. Поэтому в качестве параметров процедур (функций), а также возвращаемых значений функций, выполняемых на сервере, следует использовать значения примитивных типов, ссылки на объекты базы данных, системные перечисления, уникальный идентификатор, результат запроса, хранилище значения, таблицу значений, массив, структуру и соответствие, при этом состав передаваемых коллекций также должен удовлетворять приведенным выше ограничениям.
7. Для внешнего соединения: Текст модулей объектов следует писать таким образом, чтобы при работе во внешнем соединении (в частности, при работе WEB-приложения), обеспечивалась работоспособность всей прикладной логики с учетом того, что часть объектов недоступна для использования во внешнем соединении, например, использование средств диалога с пользователем. Недопустимо размещать в общих модулях процедуры и функции, которые недоступны во внешнем соединении и без которых невозможна запланированная методика использования и работы объектов.
Особенно это актуально для многоязычных конфигураций, содержащих несколько языков.
В интернете достаточно много инструкций о том, где именно расположен выбор языка. По запросу "как изменить язык в 1с" гугл выдает 33 тысячи инструкций. Причем совершенно разных
Но проблема в том, что настроек достаточно много и не всегда ясно, какую именно нужно менять. Иногда инструкция помогает в решении проблемы, иногда нет.
Кажется, что 1С работает криво, запутанно и глючно. На самом деле настройка языка очень проста и работает понятно и четко. Просто языков несколько. И нужно учитывать, какой именно в каких случаях нужно менять.
Ниже краткая инструкция со всеми основными настройками, который могут влиять на язык отображения в 1С.
Какие виды языков есть в 1С, зачем они нужны.
Язык на самом деле не один, а целых три:
- Язык разработки;
- Язык интерфейса платформы;
- Язык интерфейса конфигурации;
А кроме языков, есть еще и региональные настройки, от которых зависит формат чисел, дат и времени.
Из этих пяти настроек на интерфейс влияют три:
Несмотря на многообразие инструкций и способов выполнения настроек, самих способов указания настроек достаточно мало. Их можно свести всего к пяти.
Язык разработки
Язык разработки (Вариант встроенного языка) - язык используемый для написания исходного кода конфигурации.
Выбирается основной язык программирования ("Русский" или "Английский").
Назначение: Выбор определяет, на каком языке будут формироваться языковые конструкции в модулях и выдаваться информация о базовых типах данных. От него зависит, шаблоны какого языка будут использовать при добавлении данных или использовании конструкторов.
При этом независимо от выбранного языка разработки, код можно писать на любом. В том числе и вперемешку на русском и английском.
Настройка: Язык разработки указывается в свойствах конфигурации в поле "Вариант встроенного языка"
Для определения встроенного языка конфигурации из кода 1С можно обратиться к метаданным командой Метаданные.ВариантВстроенногоЯзыка.
Менять данный язык после начала разработки нельзя. Никаких изменений в интерфейсе это не принесет, но может сделать неработоспособным написанный ранее код.
Язык интерфейса платформы.
В стандартный дистрибутив платформы входят следующие языки интерфейса платформы:
английский, азербайджанский, болгарский, венгерский, вьетнамский, китайский, грузинский, казахский, латышский, литовский, немецкий, польский, румынский, русский, турецкий, украинский, французский.
Соответственно, для работы пользователя можно использовать лишь один из них. Теоретически существует "Механизм быстрого частичного перевода ресурсов платформы", позволяющий для отдельного клиента/партнера в ограниченном варианте самостоятельно добавить в платформу новый язык. Но о реальных случаях использования не слышала.
При необходимости мы можем определить текущий язык интерфейса платформы с помощью функции ТекущийЯзыкСистемы().
Настройка: Есть несколько способов установить язык платформы. Наиболее простой и наиболее часто используемый это указать язык платформы в целом для всех баз 1С на данном компьютере, прописав его в файле conf.cfg.
Способ 1. Данную настройку проще всего прописать при установке платформы. Для этого достаточно на этапе "Язык интефейса по умолчанию" указать нужный язык.
Способ 2. Если платформа уже установлена, то можно перезапустить установку параметров. Для этого выбираем "Пуск"-"Панель управления"-"Программы и компоненты". Находим нужную установку 1С и нажимаем "Изменить"
Способ 3. Еще можно напрямую прописать настройку в файл. Обычно он лежит по адресу "C:\Program Files (x86)\1cv8\conf\conf.cfg". Открываем файл, добавляем строчку "SystemLanguage=RU", сохраняем.
Способ 4. Если язык платформы не прописан, то используются настройки операционной системы по умолчанию. Для их изменения выбираем "Пуск"-"Панель управления"-"Язык и региональные стандарты".
Способ 5. При работе в веб-клиенте по умолчанию используется язык, установленный как "предпочитаемый язык" в браузере. Соответственно и менять его нужно в настройках браузера.
Все прошлые способы устанавливают язык платформы в целом для всех баз на компьютере пользователя. Рассмотрим указание языка для конкретного сеанса.
Способ 6. Если для разных баз нужно использовать разные языки интерфейса, то нужный код языка можно указать в строке запуска 1C после ключа /L.
Способ 7. Если при запуске информационной базы выполняется выбор базы через типовой стартер. То ключ запуска /L можно указать в окне "Редактирование информационной базы" в поле "Дополнительные параметры запуска"
Способ 8. При запуске отладки из конфигуратора язык запуска можно указать в параметрах конфигуратора. "Сервис" - "Параметры" - "Запуск 1С:Предприятия" - "Дополнительные" - "Яык интерфейса системы".
Способ 9. При работе в браузере язык, отличный от языка по умолчанию, можно указать суффиксом адресной строки вида "/en_US/"
Способ 10. На самом деле указание кода языка в строке запуска это самый надежный вариант. Он работает всегда. Если он не сработал, значит, нужный язык просто не установлен в платформе. Возвращаемся на этап установки платформы и выбираем нужный язык.
Язык интерфейса конфигурации
Язык интерфейса конфигурации - это языки интерфейса, созданные пользователем. При разработке конфигурации разработчик продумывает, какие языки нужны пользователю данной конкретной конфигурации и для каждого языка прописывает свой вариант всех текстов, синонимов, заголовков. В отличии от языков интерфейса платформы (жестко прописанных разработчиками платформы), языки интерфейса конфигурации могут быть любыми. В том числе мы можем создать язык, не существующий в реальности. Количество языков ничем не ограничено.
Коды языков никак не связаны с кодами интерфейса платформы. Мы можем использовать любой удобный код языка. Язык интерфейса также никак не связан с настройками операционной системы. Он зависит только от разработчика конфигурации и администратора.
Единственное исключение, это разработка приложения для мобильных устройств. В этом случае рекомендуется указывать коды языков в соответствии соТекущийЯзыкСистемы() .
Есть всего два способа установки языка интерфейса.
Способ 1. Указать язык для конкретного пользователя в свойствах пользователя информационной базы.
Способ 2. Если у пользователя язык по умолчанию не указан, то будет использоваться язык, указанный в свойствах конфигурации в реквизите "Основной язык".
При работе в конфигураторе для полей, в которых поддерживается многоязычный ввод, появляется значок лупы. При нажатии на данный значок мы можем корректировать тексты на нескольких языках одновременно. Однако также можем и просто корректировать тексты в любом многоязычном поле напряму без нажатия лупы. В этом случае мы редактируем текст текущего языка, не затрагивая второй язык. Чтобы переключить текущий язык в конфигураторе есть следующие способы:
Способ 3: Выбрать в меню пункт "Конфигурация" - "Язык редактирования конфигурации". Выбрать язык, со значениями которого мы хотим работать в ближайшее время.
Способ 4: Также язык можно переключить мышкой в строке статуса в правом нижнем углу окна конфигуратора.
Способ 5: Для множественного редактирования полезно использовать режим конфигуратора "Правка" - "Редактирование текстов интерфейсов"
Региональные настройки.
Ну и последними стоит упомянуть региональные настройки. Есть региональные настройки Информационной базы в целом и региональные установки текущего сеанса. Режим настройки региональных установок информационной базы позволяет управлять форматом отображения даты, времени, чисел, логических констант и влияет на порядок сортировки строк в списках информационной базы данных.
Варианты языков региональных настроек не зависят от платформы или конфигурации. Они зависят только от возможностей операционной системы. Полный список допустимых вариантов языка региональных настроек можно получить с помощью функции ПолучитьДопустимыеКодыЛокализации()
Лично у меня в Windows 254 варианта языков, которые можно использовать как основу региональных настроек.
Используемые базой региональные настройки можно определить с пощью функции КодЛокализацииИнформационнойБазы()
Региональные настройки ИБ можно установить:
Способ 1: При создании базы. На этапе "Добавление информационной базы" необходимо выбрать язык, который будт использоваться для хранения данных.
Способ 2. Из конфигуратора. В пункте меню Администрирование – Региональные установки ИБ. Для смены языка информационной базы обязательно использование монопольного режима.
Примечания: Если в качестве СУБД используется PostgreSQL, то для существующей информационной базы изменение языка (страны) не может быть выполнено произвольным образом. Установленное значение языка (страны) можно изменить только на такое, которое будет использовать тот же порядок сортировки строк (collation) СУБД, что и существующее значение. Например, русский (Россия) может быть изменен на белорусский (Беларусь), но не может быть изменен на украинский (Украина).
Если в качестве СУБД используется IBM DB2, то смена значения языка (страны) не поддерживается.
Региональные установки конкретного сеанса влияют на отображение дат, чисел, времени при работе с ИБ. Есть несколько способов установки настройки для конкретного сеанса.
Способ 1: Установка общих настроек для всех сеансов. Для вызова режима нужно выбрать пункт Администрирование – Региональные установки ИБ и указать региональные параметры.
Способ 2. Если общие значения по умолчанию не установлены, то используются настройки операционной системы. Поэтому можно установить нужные настройки, сменив язык операционной системы.
Способ 3. Если для разных баз нужно использовать разные региональные настройки, то нужный код языка можно указать в строке запуска 1C после ключа /VL.
Способ 4. Если при запуске информационной базы выполняется выбор базы через типовой стартер. То ключ запуска /VL можно указать в окне "Редактирование информационной базы" в поле "Дополнительные параметры запуска"
Способ 5. При запуске отладки из конфигуратора язык запуска можно указать в параметрах конфигуратора. "Сервис" - "Параметры" - "Запуск 1С:Предприятия" - "Дополнительные" - "Код локализации сеанса".
В процессе работы региональные настройки текущего сеанса можно определить с помощью функции ТекущийКодЛокализации()
Итоги.
Я попыталась собрать в одном месте разнородную информацию о настройке языка в 1С. Думаю, эта статья отлично показывает принцип использования языков и послужит хорошей шпаргалкой при необходимости настройки.
В целом все варианты работы с языками в 1С можно представить следующим образом:.
Читайте также: