Операнд это в 1с
Выражение — это математическая или логическая формула, по которой вычисляется значение. Математическое выражение может стоять справа от знака равенства в операторах присваивания, быть параметром процедур или функций, индексом массива переменных. Логическое выражение может быть условием в управляющих операторах Если , Пока , Для . Выражения состоят из констант, переменных и функций, связанных символами логических и/или арифметических операций.
Арифметические операции
В языке определены следующие виды арифметических операций:
остаток от деления
Арифметические операции имеют один или два операнда, в зависимости от типа которых операция имеет ту или иную семантику. Тот или иной семантический вариант операции определяется по первому операнду. В случае несовпадения типа второго операнда с требуемым, значение преобразуется к требуемому типу в соответствии с правилами преобразования типов. Если тип первого операнда не соответствует ни одному из допустимых типов, то в зависимости от ситуации может производиться преобразование типов или возбуждаться состояние ошибки выполнения.
Сложение определено для следующих типов операндов:
Дата + Число (к дате прибавляется число дней)
Вычитание определено для следующих типов операндов:
Дата – Число (от даты отнимается число дней)
Дата – Дата (результатом является число дней между датами)
Остаток от деления:
Замечание. При выполнении операции % (остаток от деления) оба операнда операции округляются до целого значения.
Операция конкатенации
Операция конкатенации ("+") используется для того, чтобы присоединить одну строку к другой. Длина результирующей строки равна сумме длин соединяемых строк. В случае несовпадения типа данных второго или последующих операндов со строковым типом, их значение преобразуется к строковому типу в соответствии с правилами преобразования типов.
· Для того, чтобы удалить ненужные пробелы, используются системные функции СокрЛ и СокрП .
ФИО = СокрП(Фамилия) + " " + СокрП(Имя) + " " + СокрП(Отчество);
Логические операции
Логическая операция сравнивает операнды и вырабатывает логическое значение: «истина» или «ложь». Существует два вида логических операций: операции сравнения и булевы операции. В операциях сравнения сравниваются два значения. Булевы операции выполняются над логическими значениями, реализуя булеву алгебру. Символы булевых операций могут комбинироваться, образуя составные операции.
Операции сравнения:
В языке определены следующие виды операций сравнения:
больше или равно
меньше или равно
Операции сравнения определены для следующих типов операндов:
Больше или равно:
Меньше или равно:
Булевы операции:
В языке определены следующие виды булевых операций:
конъюнкция (булево И)
дизъюнкция (булево ИЛИ)
логическое отрицание (булево отрицание НЕ)
Числовые константы
Константа числового типа представляется в виде:
0 123 -15 +24.11 0.245
Константы даты
Дата задается в формате 'ДД.ММ.ГГ' или 'ДД.ММ.ГГГГ' (дата заключается в одиночные кавычки). Неопределенная дата задается как '00.00.00'.
Строковые константы
Константа строкового типа представляется как любая последовательность символов, заключенных в двойные кавычки.
"Это самая правильная строка"
Кроме того, допускаются «многострочные» строковые константы. В исходном тексте многострочные константы могут задаваться двумя способами:
· Первый вариант: В данном случае между фрагментами, представляющими отдельные строки многострочной константы, не должно встречаться никаких символов, за исключением пробелов, переводов строки и строк комментариев.
Стр = "Первая строка" // пример строковой константы
· Второй вариант: В данном примере значение константы полностью идентично предыдущему примеру. Отличие заключается в том, что каждая отдельная составляющая не замыкается кавычками, а на каждой последующей строке помещен символ переноса строки "|". В этом варианте комментарии между открывающей и закрывающей кавычками не допускаются.
Стр = "Первая строка
Строковые выражения
Строковые выражения могут использоваться в качестве параметров методов, процедур и функций, либо в правой части оператора присваивания. Строковым выражением может быть отдельная строка или сложное сочетание строковых констант, функций и операций. То, что выражение является строковым, определяется по первому операнду. В случае несовпадения типа второго и последующих операндов со строковым типом, их значения преобразуются к требуемому типу в соответствии с правилами преобразования типов. Чтобы указать, что выражение является строковым, можно, например, начинать его с пустой строки символов "".
Стр = СокрП("Фамилия" + ", " + Имя + ", " + " отчество");
Стр1 = "" + Докум.Цена + Валюта.СокрНаим;
Логические выражения
В логических выражениях происходит вычисление логического значения (истина/ложь). Обычно логические выражения используются в управляющих операторах, в которых на основании результата логического выражения определяется дальнейшая последовательность выполнения программы. Логические выражения вычисляются слева направо. Для того, чтобы избежать неоднозначности и управлять последовательностью операндов, следует применять круглые скобки.
Математические выражения – выражения, содержащие знаки арифметических операций и подчиняющиеся при вычислении арифметическим правилам. Результатом вычисления таких выражений является значение одного из простых (базовых) типов языка.
Математические выражения используются в правой части оператора присваивания, а также в качестве параметров процедур и функций
Во встроенном языке определены арифметические операции двух видов:
-
– операции с одним значением; – операции с двумя значениями;
Символ | Описание |
---|---|
Унарные | |
— | Минус |
Бинарные | |
+ | Операция сложения |
— | Операция вычитания |
* | Операция умножения |
/ | Операция деления (делитель должен быть отличен от нуля) |
% | Определение остатка от деления |
Унарные арифметические операции
Унарный минус
Данная арифметическая операция выполняет получение отрицательного (противоположного) значения.
Унарный минус определен только для типа Число . Во всех остальных случаях будет выдано исключение « Операция получения отрицательного значения не определена для строковой величины »
Бинарные арифметические операции
Операция сложения
Данная арифметическая операция выполняет добавление значения второго операнда к значению первого. При этом тип значения получаемого результата определяется типом первого операнда. Если тип второго операнда не совпадает с типом первого, выполняется неявное преобразование типов.
Применимость операции сложения:
ОперандА | ОперандБ | Результат | Комментарий |
---|---|---|---|
Число | Число, Строка, Дата | Число | |
Дата | Число | Дата | К исходной дате добавляется количество дней, заданное вторым оператором |
Строка | Строка, Число, Дата | Строка | К исходной строке добавляются все символы второй. Длина конечной строки определяется суммой длин обеих строк. Такую операцию называют еще конкатенацией строк |
Операция вычитания
Данная арифметическая операция выполняет вычитание значения второго операнда из значения первого. При этом тип значения получаемого результата определяется типом первого операнда. Если тип второго операнда не совпадает с типом первого, выполняется неявное преобразование типов.
Применимость операции вычитания:
ОперандА | ОперандБ | Результат | Комментарий |
---|---|---|---|
Число | Число, Строка, Дата | Число | |
Дата | Число | Дата | От исходной даты отнимается количество дней, заданное вторым оператором |
Дата | Дата | Число | Вычисляется количество дней на которое первая дата больше второй |
Операция умножения
Данная арифметическая операция выполняет умножение значения первого операнда на значение второго. Операция применима только для типа Число . Если тип второго операнда не совпадает с типом первого, выполняется неявное преобразование типов.
Операция деления
Данная арифметическая операция выполняет деление значения первого операнда на значение второго. Операция применима только для типа Число . Если тип второго операнда не совпадает с типом первого, выполняется неявное преобразование типов.
Остаток от деления
Данная арифметическая операция вычисляет остаток от деления значения первого операнда на значение второго. Операция применима только для типа Число . Если тип второго операнда не совпадает с типом первого, выполняется неявное преобразование типов. Следует учитывать, что оба операнда операции округляются до целого значения.
Приоритет выполнения арифметических операций
При вычислении результата математических выражений, программа руководствуется приоритетом арифметических операций (в порядке убывания):
- Унарный минус;
- Умножение, деление, остаток от деления;
- Сложение и вычитание;
Для того, чтобы повлиять на порядок вычислений можно использовать круглые скобки.
Область применения: управляемое приложение, мобильное приложение, обычное приложение.
Методическая рекомендация (полезный совет)
1. Если в операции деления заранее известны порядки числителя и знаменателя, то следует по возможности избегать выполнения деления числа заведомого маленького порядка на число заведомо большого порядка. Например, вместо:
0.02 / 28346 * 9287492
0.02 * 9287492 / 28346
2. При выполнении арифметических операций в запросах к базе данных платформа 1С:Предприятия поддерживает точность вычислений до 8 разрядов дробной части. Однако, из-за особенностей работы различных СУБД в некоторых ситуациях точность результатов может отличаться от 8. Более подробно о вычислении разрядности результатов можно почитать в статье ИТС Разрядность результатов выражений и агрегатных функций в языке запросов.
Если точность результата выполнения запроса к базе данных, содержащего
- арифметические операции деления,
- агрегатные функции СРЕДНЕЕ ,
- арифметические операции умножения, если каждый из множителей может иметь дробную часть,
различается на различных СУБД, то рекомендуется к операндам и/ или результатам этих операций применять оператор явного приведения разрядности и точности числовых данных:
ВЫРАЗИТЬ(. КАК Число(m, n))
Оператор ВЫРАЗИТЬ следует применять к операндам, если на какой-нибудь СУБД точность получаемого результата недостаточна. Например, требуется 10 разрядов после запятой, а получается 6.
При этом указанная общая разрядность операндов должна быть минимальной, но не меньше той, которая достаточна для представления значений каждого из операндов. Неоправданное завышение разрядности может привести к потере точности последующих вычислений и несколько снизить скорость выполнения запроса.
Важно иметь в виду, что на разных СУБД имеются различные ограничения на максимальную разрядность десятичных чисел. Самое жесткое ограничение — это 31 разряд в целой и дробной частях. Чем меньшее значение разрядности будет указано для операндов, тем выше сможет быть точность результата. Например, если в результате требуется не менее 10 разрядов дробной части, первый операнд заведомо помещается в 15 разрядов целой части, а второй операнд заведомо помещается в 5 знаков целой части, то выражение может быть записано так:
ВЫБРАТЬ
ВЫРАЗИТЬ(Таблица.Множитель * Таблица.Числитель КАК Число(25,10)) / ВЫРАЗИТЬ(Таблица.Знаменатель КАК Число(15,10)) КАК Результат
ИЗ Таблица КАК Таблица
Оператор ВЫРАЗИТЬ следует применять к результату, если точность вычислений на всех СУБД достаточна, но на некоторых она больше, а на других меньше. При этом указанная общая разрядность результата должна быть минимальной, но не меньше той, которая достаточна для представления значений результата. Если в приведенном примере известно, что Знаменатель не может быть меньше 0.00001, то для представления результата достаточно 20 разрядов целой части. В этом случае выражение может быть записано так:
ВЫБРАТЬ
ВЫРАЗИТЬ(Таблица.Множитель * Таблица.Числитель / Таблица.Знаменатель КАК Число(30,10)) КАК Результат
ИЗ Таблица КАК Таблица
Иногда может быть целесообразно выполнить приведения к требуемой точности как операндов, так и результата. Например:
ВЫБРАТЬ
ВЫРАЗИТЬ(ВЫРАЗИТЬ(Таблица.Множитель * Таблица.Числитель КАК Число(25,10)) / ВЫРАЗИТЬ(Таблица.Знаменатель КАК Число(15,10)) КАК Число(30,10)) КАК Результат
ИЗ Таблица КАК Таблица
В языке определены следующие виды арифметических операций.
- Сложение (Оп1 + Оп2)
- Вычитание (Оп1 — Оп2)
- Умножение (Оп1 * Оп2)
- Деление (Оп1 / Оп2)
- Остаток от деления (Оп1 % Оп2)
- Унарный минус (-Оп1)
Арифметические операции имеют один или два операнда, в зависимости от типа которых операция имеет ту или иную семантику. Тот или иной семантический вариант операции определяется по первому операнду. В случае несовпадения типа второго операнда с требуемым значение преобразуется к требуемому типу в соответствии с правилами преобразования типов. Если тип первого операнда не соответствует ни одному из допустимых типов, то в зависимости от ситуации может производиться преобразование типов или возбуждаться состояние ошибки выполнения.
Сложение определено для следующих типов операндов:
Дата + Число (к дате прибавляется число секунд)
Вычитание определено для следующих типов операндов:
Дата — Число (от даты отнимается число секунд)
Дата — Дата (результатом является разница между двумя датами, измеренная в секундах)
Математические выражения – выражения, содержащие знаки арифметических операций и подчиняющиеся при вычислении арифметическим правилам. Результатом вычисления таких выражений является значение одного из простых (базовых) типов языка.
Математические выражения используются в правой части оператора присваивания, а также в качестве параметров процедур и функций
Во встроенном языке определены арифметические операции двух видов:
Унарные арифметические операции
Унарный минус
Данная арифметическая операция выполняет получение отрицательного (противоположного) значения.
Унарный минус определен только для типа Число . Во всех остальных случаях будет выдано исключение « Операция получения отрицательного значения не определена для строковой величины »
Бинарные арифметические операции
Операция сложения
Данная арифметическая операция выполняет добавление значения второго операнда к значению первого. При этом тип значения получаемого результата определяется типом первого операнда. Если тип второго операнда не совпадает с типом первого, выполняется неявное преобразование типов.
Применимость операции сложения:
ОперандА | ОперандБ | Результат | Комментарий |
---|---|---|---|
Число | Число, Строка, Дата | Число | |
Дата | Число | Дата | К исходной дате добавляется количество дней, заданное вторым оператором |
Строка | Строка, Число, Дата | Строка | К исходной строке добавляются все символы второй. Длина конечной строки определяется суммой длин обеих строк. Такую операцию называют еще конкатенацией строк |
Операция вычитания
Данная арифметическая операция выполняет вычитание значения второго операнда из значения первого. При этом тип значения получаемого результата определяется типом первого операнда. Если тип второго операнда не совпадает с типом первого, выполняется неявное преобразование типов.
Применимость операции вычитания:
ОперандА | ОперандБ | Результат | Комментарий |
---|---|---|---|
Число | Число, Строка, Дата | Число | |
Дата | Число | Дата | От исходной даты отнимается количество дней, заданное вторым оператором |
Дата | Дата | Число | Вычисляется количество дней на которое первая дата больше второй |
Операция умножения
Данная арифметическая операция выполняет умножение значения первого операнда на значение второго. Операция применима только для типа Число . Если тип второго операнда не совпадает с типом первого, выполняется неявное преобразование типов.
Операция деления
Данная арифметическая операция выполняет деление значения первого операнда на значение второго. Операция применима только для типа Число . Если тип второго операнда не совпадает с типом первого, выполняется неявное преобразование типов.
Остаток от деления
Данная арифметическая операция вычисляет остаток от деления значения первого операнда на значение второго. Операция применима только для типа Число . Если тип второго операнда не совпадает с типом первого, выполняется неявное преобразование типов. Следует учитывать, что оба операнда операции округляются до целого значения.
Приоритет выполнения арифметических операций
При вычислении результата математических выражений, программа руководствуется приоритетом арифметических операций (в порядке убывания):
- Унарный минус;
- Умножение, деление, остаток от деления;
- Сложение и вычитание;
Для того, чтобы повлиять на порядок вычислений можно использовать круглые скобки.
Завершаем цикл статей по нормативной подсистеме в 1С:УПП.
В рамках этого цикла мы детально рассмотрели, как работают спецификации в УПП – от теории до практики использования.
Итак, 9 статей по нормативной подсистеме УПП:
Формулы исходных комплектующих
О чем эта статья
В спецификациях номенклатуры для расчета потребного количества материалов (полуфабрикатов) могут использоваться формулы. В них определяется алгоритм расчета исходных комплектующих.
В этой статье расскажем, какие параметры можно установить при составлении формул расчета.
Введение
В карточке спецификации номенклатуры в табличной части на закладке Исходные комплектующие предусмотрено специальное поле Формула. Указанная формула применяется для той исходной комплектующей, в строке которой она записана.
Для записи выражения расчета количества материалов используется специальная обработка, которая называется «Ввод формулы». Обработка вызывается из поля Формула табличной части Исходные комплектующие.
В формуле возможно использование:
- арифметических операций (сложение, вычитание, умножение, деление)
- операций сравнения (больше, меньше, равно, операнд сравнения)
- функций (выбора максимального и минимального значения, получения целой части числа, округления до целого значения)
- скобок для задания приоритета операций.
В формулах расчета могут также использоваться:
- числа
- параметр количества (значение реквизита Количество текущей строки табличной части Исходные комплектующие)
- свойства характеристики выходного изделия, имеющие тип значения «Число» или «Булево»
- параметры выпуска, которые определяются на специальной закладке Параметры выпуска продукции.
Откроем карточку спецификации «Кресло офисное (эксперимент) Комфорт». Из поля Формула в табличной части на закладке Исходные комплектующие откроем форму Ввод формулы. Для этого в поле нажмем на кнопку выбора.
В верхней части формы Ввод формулы располагается табличное поле, в котором будет отображаться составленная формула.
Ниже располагаются кнопки для заполнения формулы. Это знаки арифметических операций, скобки для задания приоритетов операций, операнд условия, знаки операций сравнения (меньше, равно, больше), функции (минимум, максимум, округление, целое). Здесь также присутствуют кнопки для перемещения по формуле, раздвигания и удаления символов.
В формуле можно для параметров использовать имена или их коды. Для этого в форме предусмотрен специальный переключатель Коды / имена.
Ниже располагается строка с цифрами и знаками «запятой» и «точки». Предусмотрена специальная команда для подстановки в формулу параметра Количество.
Имеется возможность заполнения формулы из шаблона.
В форме Ввод формулы присутствует также табличная часть для параметров выпуска продукции и табличная часть со свойствами характеристики номенклатуры, которые могут быть использованы при составлении формулы.
Использование в формуле параметра «Количество для исходной составляющей»
Для рассмотрения практического примера в табличной части Исходные комплектующие спецификации «Кресло офисное (эксперимент) Комфорт» добавим новую строку. В новой строке в поле Номенклатура укажем материал «Клей мебельный». В поле Количество установлено значение 1,000. Из поля Формула откроем форму Ввод формулы.
Составим формулу, согласно которой параметр Количество следует разделить на 3. При составлении выражения используем параметр Количество (В форме Ввод формулы используем команду Параметры – Количество).
Сохраним изменения, внесенные в спецификацию.
Обратимся к заранее заготовленному документу «Отчет производства за смену», в котором на закладке Продукция и услуги указано «Кресло офисное Комфорт» в количестве 1,000 штуки. В поле Спецификация выбрано значение «Кресло офисное (эксперимент) Комфорт».
В документе «Отчет производства за смену» заполним закладку Материалы с использованием сервиса Заполнить по спецификации.
Для материала «Клей мебельный» в поле Количество установилось значение 0,334 (1,000 / 3).
Таким образом, в качестве значения параметра Количество, указываемого в формуле, используется значение реквизита Количество, указанное для исходной составляющей в спецификации номенклатуры.
Использование в формуле свойств характеристики выходного изделия
В формулах используются только те свойства характеристики выходного изделия, которые имеют тип значений «Число» или «Булево».
К значениям типа «Число» в формулах для расчета можно применять все арифметические операции и операции сравнения.
Для типа значений «Булево» предусмотрено только два значения: «Ложь» или «Истина». Эти значения могут быть использованы в сравнениях.
Из карточки спецификации «Кресло офисное (эксперимент) Комфорт» откроем форму выбора характеристики выходного изделия.
На данный момент среди свойств характеристики нет свойств с типом значения «Число» или «Булево». Поэтому добавим новое свойство с типом значения «Число».
При выборе типа значения «Число» имеется возможность указать параметры этого числа: Длину, Точность (количество знаков после запятой), признак неотрицательного числа.
Определим Наименование нового свойства – «Высота спинки». В зависимости от значения этого свойства будет определяться расход какого-либо материала. В параметрах числа установим флаг Неотрицательное и укажем значение Точности – 0, так как высоту спинки будем измерять в целых сантиметрах. Для параметра Длина будет достаточно значения 3.
В карточке создаваемого свойства в табличной части Назначения свойства укажем позицию номенклатуры «Кресло офисное Комфорт».
Созданное свойство появится в форме выбора характеристики выходного изделия. Определим значение этого свойства в уже существующих характеристиках. Укажем значения 80, 100 и 120 сантиметров.
Составим формулу расчета расхода «Клея мебельного». Расход будет зависеть от значения свойства «Высота спинки». Предположим, что на каждые 20 сантиметров высоты спинки требуется 0,1 кг клея. Необходимо высоту спинки умножить на норму расхода клея. В качестве разделителя дробной части выступает точка.
Сохраним изменения, внесенные в спецификацию «Кресло офисное (эксперимент) Комфорт».
Обратимся к документу «Отчет производства за смену». На закладке Продукция и услуги указано «Кресло офисное Комфорт» в количестве 1,000 штуки. В поле Спецификация выбрано значение «Кресло офисное (эксперимент) Комфорт». В поле Характеристика продукции указана характеристика, для которой Высота спинки составляет 80 сантиметров.
Произведем заполнение табличной части на закладке Материалы с использованием сервиса Заполнить по спецификации.
Расход «Клея мебельного» составил 0,400 кг (80 х 0,1 / 20). Аналогично можно рассчитать расход «Клея мебельного» в случае указания на закладке Продукция и услуги документа «Отчет производства за смену» других характеристик номенклатуры «Кресло офисное Комфорт». При этом, соответственно, будут получены значения 0,500 кг (100 х 0,1 / 20) и 0,6 кг (120 х 0,1 / 20).
Использование в формуле параметров выпуска продукции
На расход материалов или полуфабрикатов могут оказывать влияние некоторые внешние факторы, такие как температура, влажность. Информация о тех параметрах выпуска, которые влияют на расчет количества исходных комплектующих, заполняется в спецификации на закладке Параметры выпуска продукции. Эти параметры становятся доступными в форме Ввод формулы.
В спецификации на закладке Параметры выпуска продукции указывается Вид параметра как элемент справочника «Виды параметров выпуска продукции».
Создадим новый элемент справочника «Виды параметров выпуска продукции» – «Температура». В поле Комментарий запишем: «в градусах Цельсия».
Выберем созданный параметр для заполнения табличной части Параметры выпуска продукции и определим Значение по умолчанию, например 22,000 (градуса Цельсия).
Вернемся на закладку Исходные комплектующие и для исходной составляющей «Клей мебельный» откроем форму Ввод формулы. В форме появился доступный к использованию параметр выпуска продукции.
Предположим, что норма расхода клея зависит от температуры. В диапазоне температур от 17 до 23 градусов Цельсия норма расхода составляет 0,1 кг на 20 сантиметров высоты спинки кресла. Если температура ниже 17 градусов, то норма расхода выше и составляет 0,11 кг на 20 сантиметров высоты спинки кресла. При температуре выше 23 градусов норма расхода составляет 0,095 кг.
В формуле расчета будем использовать операнд сравнения. Операнд сравнения осуществляет вычисление некоего логического условия. В зависимости от результата вычислений («Истина» или «Ложь»), операнд возвращает одно из двух определенных значений. То есть если условие выполняется, то возвращается одно значение, а если нет, то другое.
Операнд условия записывается следующим образом:
? (Условие, Значение если «Истина», Значение если «Ложь»).
В рассмотренной ранее формуле « * 0.1 / 20» параметр «Высота спинки» сохраняется, значение 20 тоже остается. Для отражения изменения норматива в зависимости от температуры окружающей среды вместо значения 0.1 будет использоваться переменная величина, зависящая от параметра «Температура».
Сначала будем сравнивать значение температуры с числом 17. Если температура меньше 17 градусов, то норма расхода 0,11 кг. В противном случае, если температура больше 23 градусов, то норма расхода 0,095 кг, а если нет, то норма расхода 0,1 кг.
В выражении это будет выглядеть так:
?( [Температура] 23, 0.095, 0.1))
Подставим это выражение в ранее составленную формулу вместо значения 0.1.
Сохраним изменения, внесенные в спецификацию и обратимся к документу «Отчет производства за смену». На закладке Продукция и услуги указано «Кресло офисное Комфорт» в количестве 1,000 штуки. В поле Спецификация выбрано значение «Кресло офисное (эксперимент) Комфорт». В поле Характеристика продукции указана характеристика, для которой Высота спинки составляет 100 сантиметров.
Заполним табличную часть на закладке Материалы с использованием сервиса Заполнить по спецификации.
Расход «Клея мебельного» составил 0,500 кг. В качестве значения параметра «Температура» было использовано ранее установленное значение по умолчанию – 22 градуса. Для данной температуры определен норматив расхода клея 0,1 кг на 20 сантиметров высоты спинки кресла. Высота спинки кресла составляет 100 сантиметров. То есть расход клея вычисляется следующим образом: 100 х 0,1 / 20 = 0,500 кг.
Чтобы явно определить значение параметра «Температура», следует в документе «Отчет производства за смену» на закладке Продукция и услуги нажать на кнопку Параметры в командной панели табличной части. Откроется форма обработки «Ввод параметров выпуска продукции» с помощью которой вводится информация о конкретных значениях параметров.
В табличной части открывшейся формы укажем Вид параметра – «Температура» и Значение – 25 градусов.
Заполним табличную часть на закладке Материалы с использованием сервиса Заполнить по спецификации.
Расход «Клея мебельного» составил 0,475 кг. Для температуры 25 градусов определен норматив расхода клея 0,095 кг на 20 сантиметров высоты спинки кресла. Высота спинки кресла составляет 100 сантиметров. То есть расход клея вычисляется следующим образом: 100 х 0,095 / 20 = 0,475 кг.
Установим значение параметра «Температура» – 16 градусов и вновь заполним табличную часть на закладке Материалы с использованием сервиса Заполнить по спецификации.
Расход «Клея мебельного» составил 0,550 кг. Для температуры 16 градусов определен норматив расхода клея 0,11 кг на 20 сантиметров высоты спинки кресла. Высота спинки кресла составляет 100 сантиметров. То есть расход клея вычисляется следующим образом: 100 х 0,11 / 20 = 0,550 кг.
Подробнее нормативная система рассматривается в курсе
УПП от А до Я [Производство, Торговля, Персонал и Управление]
Сколько же всего сложного и таинственного нас окружает.
Черные дыры и сновидения. Темная материя и подсознание. Корпускулярно-волновой дуализм и 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С.
Понравилась статья?
Поставьте лайк плюс. Пишите свои идеи и комментарии по теме. Статья будет дополняться.
Читайте также: