Как сделать код красивым 1с

Обновлено: 05.07.2024

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

Обычное решение, как делают почти все:

Счетчик = 0;
Для Каждого Строка Из ТЗ Цикл
Счетчик = Счетчик + 1;
НоваяСтрока = Реестр.Добавить();
НоваяСтрока.Номер = Счетчик;

Более красивое решение (при условии что сортировки нет):

Для Каждого Строка Из ТЗ Цикл
НоваяСтрока = Реестр.Добавить();
НоваяСтрока.Номер = Реестр.Количество();

Я когда нахожу более красивые/короткие решения в чужом коде, то стараюсь их запоминать. И вот как-то хочется писать максимально коротко, как и где этому учиться непонятно :)

А вообще было бы интересно посмотреть на похожие "укороченные" решения.

Название не удачно написал. Имелось ввиду "как учиться самому", а не учить других :)
(2) +100. Максимально коротко - не всегда максимально хорошо :)

Не проводил исследований, хранит ли ТЗ в своем объекте КоличествоСтрок или считает динамически, поэтому сделал бы через счетчик.

А ты проводил исследования?

это искусство, это само приходит. Со временем, посмотри попробуй как пишут 1с програмисты конфигурации, мне помогало. Они иногда очень дельно пишут и хитро, не сразу разберешься.
Если код писать на английском - то буков должно быть поменьше , код будет покороче.
(15) если бы типовые были на английском - тогда да, иначе фигня выйдет, твой код на английском, типовые переменные и методы - на русском
(0) Объясните, мил человек, зачем Вам собственно счетчик в таблице значений? который у вас хранится в параметре "Номер"? Там же индекс строки есть
Я бы скопировал ТЗ и обошел бы ее строки, обработав как необходимо. Причем копирование позволяет скопировать только часть таблицы (например необходимые колонки)
(12)(18) + В цикле вообще нужно обходится без вызова ненужных функций. Сколько она будет количество считать если там 100500 миллионов строк будет.
(22) Не все, стремящиеся писать короткий код (толком не понимая зачем), слышали про индексы :)
(22) потом скорей всего что то сортировать или сворачивать будет и не хочет оригинальную последовательность потерять.

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

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

(27) Если будет сворачивать - очень интересно как не потеряет "оригинальную последовательность"
(0) Автор напиши функцию в одну строку которая получает число а возвращает его факториал =) Вот тебе красивый и коротккий код)
(27) Так он нумерует последовательно - у него всегда Номер = Индекс +1
(28) согласен, а то ужмут 10 условий через вопросы в одну строку. Потом полчаса распутвай пытаясь понять че хотели

(0) вроде уже и так все сказали, но добавлю от себя.

Автор используя "Реестр.Количество();" полагается на то ,что счетчик количества строк хранится в классе объекта. Но ведь нигде это не документированно. Вполне вероятно ,что там аналогичное обычному циклу обновление. И в этом случае код №1 явно будет выигрывать.

Оптимизация понятие относительно весьма. Так что + 100500 за то, что "короче" не всегда равняется "лучше"

(28) +1
Убить иногда хочется людей экономящих на описании того, что они вообще делают в коде. А тем более использующих многоэтажные конструкции непонятно зачем.
(0) Нормальный программист всегда напишет первый вариант.
Второй - откровенный копрокод.
Думаю главное не красота, а скорость работы кода.
Чаще чем короче тем тормозней )))
а в чем красота? Красота в удобочитаемости, в последовательности и логичности)
(42) У меня нет проблем) Это автору - пример красивого кода)
(42) да, возврат при 0, значение умножаем на рекурсию со значением - 1)
(8) Это в форме делается код, строк штук пять обычно, так что в данном случае производительность значения не имеет. Хотя в других случаях, где имеет, я бы тоже предпочел счетчик сделать.
(45) В один прекрасный момент их будет несколько тысяч. Лучше сразу делать нормально и не спотыкаться на ровном месте.
(45) пользуйся замером производительности, вопросов будет меньше
(0) оптимизация по объёму исходного кода - хучший вариант оптимизации
(0) это что ли имется ввиду? У меня таких примеров немало.
А у Гилёва даже есть спецкурс на тему оптимизации.
(56)(57) В этом случае да. Но когда вместо описанного комментариями нормального ветвления через несколько Если Тогда, заменяют на мегастроку с кучей ИЛИ И и ?(,,) тут плеваться охота.
Первый код логичнее и проще, следовательно лучше. Второй красивее, но некоторые и из каждой процедуры другую вызывают и считают себя крутыми программистами, когда можно все поместить в одной
(56) да, примерно это. Часто пишешь и просто не думаешь что это можно укоротить.
(59) во не! Я как раз не люблю когда в одной процедуре 150 страниц кода. Я сам вообще страюсь чтобы процедура влазила в экран :) Если не влазит, то дроблю на 2 процедуры уже. Народу это нравится, что код понятный и читабельный стает.
(0)Главное для проегра 1с за сколько времени он исправляет ошибки. Второй вариант быстрее вкурится и исправится чем первый и вероятность ошибок во втором коде меньше. Конечно в крайности бросаться не стоит и там где прога тормозит надо писать оптимально по производительности.
(61) А если текст запроса на экран не влазит? Тоже дробишь его на несколько процедур? :)
(8) в сериализованной XML из ТЗ ЕМНИП количество строк есть, но даже если там руками поменять на 0, эта XML нормально прочитается в ТЗ

(0) ТС, объясни, за каким фигом делать нумерацию в ТЗ?

а потом ещё заниматься оптимизацией, там где она как минимум не нужна?

(63) Конечно. Чем программа на декларативном языке отличается от программы на языке процедурном?
(67) очень хочу увидеть хотя бы основные принципы разбиения больших запросов на части. поделись.
(30) ПолучитьФакториалЧисла(МоёЧисло)
(69) Это есть в типовых. Куча запросов создаётся в отдельных функциях.

(69) примерно так, немножко беспорядок, но принцип думаю понятен

А если еще и обфускатором пройтись, код совсем, панимаешь, компактным станет. Насчет "красивым", правда, не уверен, гг.
такое правда удобнее читать и сопровождать, чем один запрос простыней?

(74) конечно, думаешь это просто так, из любви к искусству?

для сравнения, конечный результат
|

CASE WHEN регП.КоличествоНО != 0 THEN регМХ.КоличествоНО * (регП.СуммаНО / регП.КоличествоНО) ELSE 0 END СуммаНО,
CASE WHEN регП.КоличествоПриход != 0 THEN регМХ.КоличествоПриход * (регП.СуммаПриход / регП.КоличествоПриход) ELSE 0 END СуммаПриход,
CASE WHEN регП.КоличествоРасход != 0 THEN регМХ.КоличествоРасход * (регП.СуммаРасход / регП.КоличествоРасход) ELSE 0 END СуммаРасход,

SELECT
HAVING
sum(КоличествоНО) <> 0 Or sum(КоличествоПриход) <> 0 Or sum(КоличествоРасход) <> 0

SELECT
HAVING
sum(КоличествоНО) <> 0 Or sum(КоличествоПриход) <> 0 Or sum(КоличествоРасход) <> 0
OR sum(СуммаНО) <> 0 Or sum(СуммаПриход) <> 0 Or sum(СуммаРасход) <> 0
OR sum(ВесНО) <> 0 Or sum(ВесПриход) <> 0 Or sum(ВесРасход) <> 0

LEFT JOIN Дерево_Материалы Группы ON Группы.ID = Элементы.ParentID and Группы.ParentID = ' 0 '
LEFT JOIN спрМатериалы Материалы ON Материалы.ID = Группы.ID
) ДеревоУр1 ON ДеревоУр1.Материал = Материалы.ID AND ДеревоУр1.Level = 1

LEFT JOIN Дерево_Материалы Группы ON Группы.ID = Элементы.ParentID and Группы.ParentID = ' 0 '
LEFT JOIN спрМатериалы Материалы ON Материалы.ID = Группы.ID
) ДеревоУр2 ON ДеревоУр2.Материал = Материалы.ID AND ДеревоУр2.Level = 2

Мне частенько приходится взаимодействовать с 1С-разработчиками, и во время совместной работы над проектами замечаю, что далеко не все из них хорошо знают свой главный инструмент – «Конфигуратор». Причем это не относится к степени крутости девелопера. Как оказалось, даже синьоры пользуются далеко не всеми возможностями «Конфигуратора», а ведь они могут сэкономить кучу времени, а тем самым повысить продуктивность разработчика.

Под катом я решил собрать несколько полезных фишек стандартного конфигуратора, которыми пользуюсь регулярно. Многие из них появились в платформе «1С:Предприятие 8.3.х», поэтому перед тестированием обязательно проверьте номер версии установленной у вас платформы.

Закладки

Хорошо, если новые функции добавлены в самый конец модуля, а если потребовалось расположить в разных частях? Вот тут начинается самое интересное. Одни программисты начинают скролить текст (как правило, этим страдают новички). Более продвинутые применяют поиск по тексту (Ctrl + F).

Оба способа рабочие, но пользоваться ими долго. Куда правильней использовать функцию «закладки». Например, переходим к какой-нибудь строке. Нажимаем ALT + F2 и получаем закладку (слева от строки отобразиться квадратик).


Убирается закладка тем же сочетанием клавиш. Так вот, закладок может быть в модуле расставлено много. По ним легко передвигаться нажатием клавиши F2. Фича крутая, но она была изначально не доделана и не позволяла, например, передвигаться по закладкам в разных модулях. Это досадное ограничение создавало лишние тормоза для программистов, привыкших к хорошим IDE (например, Visual Studio, PHP Storm).

В версии 8.3 недочет исправили и сделали классную вещь – «Список закладок». Нажимаем клавиши «Ctrl + Shift + F2», и перед нами откроется окно с полным списком установленных закладок:


В нем перечислены все закладки в разрезе модулей. Для каждой закладки указан номер строк и доступен перечень действий: перейти к коду, удалить закладку, удалить все закладки.

Таким образом, работать с закладками стало на порядок проще. Еще бы добавили возможность установки горячих клавиш на закладки, и стало бы совсем хорошо. Помню еще со времен «Delphi 6» привык к установке закладок по горячим клавишам Alt + <Цифра>. Наставил закладок и быстро перемещайся по ним.

Группировка строк

В «1С:Предприятие» с самого начала была одна большая проблема – отсутствие возможности создавать дополнительные модули для определенных объектов. Например, есть у меня справочник «Контрагенты» и мне хочется разделить его функционал на модули. Допустим, функционала очеееень много. Так вот, в моем распоряжении все равно стандартный набор: Модуль объекта, Модуль менеджера и модуль формы. Понятное дело, что у каждого модуля своя роль, но что делать мне с моими 100500 функциями, которые относятся непосредственно к справочнику «Контрагенты»?

По мнению 1С я должен оформить их в виде общего модуля. С одной стороны, идея классная. Делаем модуль, его сразу видно и т.д., и т.п. Правда всегда есть один нюанс. Если следователь этой методике, то при наличии кучу объектов в конфигурации число общих модулей будет зашкаливать.

Вот взять хотя бы библиотеку БСП. Стоит ее внедрить и в количестве модулей начинает теряться. Я уже молчу про конфигурации, которые построены на базе БСП. Там и сто пятьсот модулей от БСП, и еще столько же специально для конфигурации.

В общем, неудобство налицо (особенно после опыта разработки в языках, где нет подобных ограничений). Увы, спастись от этой проблемы в настоящее время не получится. Зато, мы можем использовать возможности группировки функций/процедур в модулях.+

Например, есть у нас общий модуль «РаботаСКонтрагентами». В нем часть функций отвечают за поиск контрагента, другая часть за загрузку контрагентов из внешних источников и т.д. Чтобы не потеряться во всем этом многообразии возможностей, можно логически сгруппировать все функции/процедуру. Для этого в платформе 8.3 появилась функция под названием «Области». Рассмотрим пример:

После добавление областей (язык препроцессора) наш код будет сгруппирован. Если их свернуть (области), то в итоге мы увидим симпатичный комментарий (см. рисунок ниже):


Клик мышкой по плюсику развернет область, и мы увидим свернутые функции. Если хочется сразу развернуть все имеющиеся функции (в пределах области), то кликаем по плюсику удерживая Ctrl.

Вот такая мега удобная вещь и в модулях с большим количеством функций спасает очень даже. В предыдущих версиях платформы было модно использовать для подобных целей блоки комментариев, но управлять/добавлять областями явно удобней.

Форматирование кода

Собственно говоря, тут и рассказывать особо нечего – выделяем код, нажимаем «Alt + Shift + F» и редактор попытается привести его в божеский вид в соответствии с вшитым code-style. Функция работает вполне сносно и ей обязательно надо пользоваться. Пишу это потому, что неоднократно видел, как разработчики пытаются отбивать отступы самостоятельно. Это конечно круто, но зачем тратить время, если большую часть работы можно выполнить одной горячей клавишей?

Комментирование

Опять же, никаких секретных действий – выделили код, нажали “Ctrl + num /” (слеш на дополнительной области клавиатуры) и получили закомментированный участок. Захотели вернуть обратно? Не беда! Выделяем закомментированный участок кода, нажимаем «Ctrl + Shift + num /» и мгновенно приводим его в боевой режим. Фишка попсовая, но опять же, новички про нее не знают, и тратят кучу времени на расстановку слешей. Да еще и матерят компанию «1С», за отсутствие возможности многострочного комментирования, как в продвинутых язык программирования.

Быстрая вставка специальных символов

Иногда возникает необходимость быстро вставить в редактор специальный символ (которого нет на клавиатуре). В большинстве случаев разработчики используют для этого функции встроенного языка (например, символ). А ведь есть способ проще. Если удерживать клавишу Alt и набрать на доп. клавиатуре код нужного символа (из таблицы ASKII), то он тут же будет вставлен. Например, держим ALT и набираем 65. На выходе получаем букву «А». Или вводим 4 и получаем бубновую масть.


Вставка специальных символов

Хорошо, с этим понятно, но какой от этого еще можно получить профит? Лично я, таким образом вставляю символ амперсанда (&). Все знают, что этот символ используется для определения параметров в языке запросов. Неудобство состоит в том, что текст запроса мы пишем на русском языке, а для добавления этого символа перед параметром приходится переключить на английский, затем нажать Shift + 7, а потом вернуться обратно на русский.

Чтобы избавить себя от этой рутиной последовательности действий, я использую выше озвученную функцию. С ее помощью для установки амперсанда требуется лишь набрать с удержанной клавишей «alt» последовательность цифр 38. При этом надобность в двойном переключении языка отпадает.

Многие могут подумать, что я искусственно раздул проблему из ничего, но тут просто дело привычки. Кода приходится писать много и вот такие мелочи немного повышают производительность и избавляют от лишних нажатий клавиши backspace (для удаления случайно набранных символов). Не убедил? Тогда просто выделите время и попробуйте себя переучить

Ниже приведено несколько полезных шаблонов кода по работе с табличным документом:

Код 1C v 8.х Код 1C v 8.х Код 1C v 8.х Код 1C v 8.х

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

Для ячейки, у которой установлен признак "СодержитЗначение", можно задать тип значения, размещаемого в ячейке.

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

Для ячейки табличного документа можно задавать формат вывода данных. Для этого используется свойство "Формат", которое содержит форматную строку. Приемы работы с форматной строкой полностью совпадают с функцией Формат()

Элемент управления в табличном документе

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

Элемент управления можно назначить через палитру свойств или из встроенного языка с помощью метода "УстановитьЭлементУправления()". Чтобы проверить в программе, установлен ли элемент управления для конкретной ячейки, можно использовать свойство "ЭлементУправления", которое возвращает элемент управления, назначенный для ячейки.

Элементы управления, встроенные в ячейку, отображаются только при входе в режим редактирования значения. На приведенном ниже рисунке редактируемая ячейка обведена овалом и в ней отображается флажок:

Ниже показан пример установки элемента управления типа "Флажок" из встроенного языка://задаем нужный тип с помощью объекта "ОписаниеТипов"

Для элементов управления, расположенных в табличном документе, расширяется набор свойств, методов и событий:

Разберем самые важные свойства и методы:

Свойство "ВстроенВЯчейку" имеет тип "булево" и говорит о том, что элемент управления встраивается в ячейку или просто привязывается к ней, о чем было рассказано выше.

Свойство "Видимость" позволяет показать или скрыть элемент управления.

Свойство "Значение" предоставляет доступ к значению, которое редактируется в элементе управления. Оно используется только для элементов управления, поддерживающих связь с данными.

Метод "Расположить" позволяет разместить элемент управления в конкретной области ячеек табличного документа. Именно этот метод был использован в вышеприведенном примере.


Что такое маска и для чего она нужна описано в статье: Поле ввода

В данном примере я хочу показать, как правильно ввести маску для ввода телефона

Телефонный номер это основной реквизит и используется в каждой базе - его корректное отображение упростит ввод и восприятие информации!

В поле Маска введите: 9 (999) 999 99 99

в режиме предприятие будет выглядеть так:


  • сотовый телефон клиента: 9 (999) 999-99-99
  • городской (без указания кода города): 999-99-99
Разместил: all4cf  Версии: | 8.2 УП | 8.3 |  Дата: 12.12.2015   Прочитано: 31902

Распечатать

Похожие FAQ

Ввод по строке - поиск по первым символам или в любом месте наименования  6
При разработке конфигурации, для упрощении ввода документов потребовалось настроить ввод номенклатуры по совпадению любой части наименования! В 1С 8.3 по умолчанию настройки справочника номенклатуры такие: При такой настройке, механизм поиска в Веб браузер в 1С используя поле HTML документа  2
Настраивал клиенту CRM, он захотел - чтобы панель управления сайтом была в 1С. Хочет - делаем: Обработка Веб браузер проста, состоит из поля HTML документа и 20 строчек кода: Код команд: НаКлиенте Процедура Команда1(Команда) Объект.HTML = ВКС - Высококвалифицированные специалисты - какие настройки нужно сделать ЗУП?  0
В этой статье мы вкратце расскажем - какие настройки нужно сделать ЗУП для временно пребывающих высококвалифицированных иностранных специалистов. Гражданство Откройте сотрудника и перейдите в настройки данных о Гражданстве Если сотрудник ВКС то Вывод результата запроса на форму УП в таблицу значений (аналог СоздатьКолонки() для УП)  2
при разработке на обычных формах было удобно выводить результат запроса используя метод СоздатьКолоки(): Процедура ПоискНажатие(Элемент) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ДокументоОборот.Этап, | ДокументоОборот.Отдел, | Докуме ЕГАИС: Розница 2.1 и сканер ШК Honeywell 1450  12
Устанавливал клиенту Розницу 1С и сканер штрихкода Honeywell Voyager 1450. При стандартной настройке - сканер работает в режиме клавиатуры. Но в таком режиме, как известно, работать невыносимо: Приходится перед вводом штрих кода вызывать окно ввода Посмотреть все результаты поиска похожих

Еще в этой же категории

Ключевые слова и Изображения

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

Изображения

Маска ввода телефона
Маска ввода телефона

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