для чего предназначен порядок кода
Особенности кода счета в 1С:Предприятии 8
Код счета
Код счета хранится в информационной базе в том виде, в котором был введен. Исключение составляет хранение кода счета в условиях, когда маска кода счета содержит символы “@”. В этом случае группа знаков кода, для которой в маске стоят символы “@”, упаковывается – из нее вырезаются пробелы.
При создании нового счета или редактировании уже имеющегося счета в плане счетов код счета редактируется с использованием маски. При вводе ссылки на счета в записях регистров и в других местах код счета вводится без маски.
Перед началом редактирования счета в плане счетов, код счета распаковывается до вида, подходящего под маску. После окончания редактирования код счета упаковывается.
Рассмотрим пример упаковки – распаковки кода счета. Пусть есть некоторый план счетов, для которого указано:
Выполним следующие действия:
Порядок счета
В информационной базе порядок счета хранится в том виде, в котором был задан. Задавать порядок счета можно только в том случае, если длина поля Порядок больше нуля.
В форме счета поле Порядок доступно для редактирования, однако по умолчанию в форму не включается, и его содержимое автоматически не заполняется. Если длина поля Порядок больше нуля и значение, записываемое в поле, представляет собой пустую строку, записать объект Счет не удастся, и произойдет соответствующая ошибка времени выполнения.
Если маска кода счета состоит только из символов «@» и «.», можно автоматически сформировать поле Порядок. Это можно сделать в обработчике события ПередЗаписью() с помощью метода ПолучитьПорядокКода():
Процедура ПередЗаписью(Отказ)
Порядок = ПолучитьПорядокКода();
КонецПроцедуры
При формировании порядка счета функция ПолучитьПорядокКода() за основу берет код счета. В пределах групп номера счета символы кода счета сдвигаются вправо, дополняясь слева необходимым количеством пробелов.
Рассмотрим два примера:
1) Код счета: «10.12»
Маска кода счета: «@@@.@@@.@@»
Сформированный прядок счета: » 10. 12″
2) Код счета: «10.5»
Маска кода счета: «@@@.@@@.@@»
Сформированный прядок счета: » 10. 5″
Свойство АвтоПорядокПоКоду
Свойство АвтоПорядокПоКоду используется для подмены упорядочивания по полю Код упорядочиванием по полю Порядок. Упорядочивание по полю Порядок в этом случае используется как, например, в формах списков счетов, так и в процессе формирования запросов.
Пример использования свойства АвтоПорядокПоКоду в форме списка счетов
На рисунке видно, что в качестве колонки, по которой идет сортировка, отмечена колонка Код. Однако реально для сортировки используются данные из поля Порядок.
На рисунке видно, что сортировка данных не изменилась. Это действительно так, поскольку свойство АвтоПорядокПоКоду включено.
Если же свойство АвтоПорядокПоКоду выключить, то сортировка будет выполняться иначе:
На рисунке видно, что сортировка выполнена по полю Порядок.
На рисунке видно, что порядок следования счетов сменился и упорядочивание происходит по полю Код.
Пример использования свойства АвтоПорядокПоКоду в запросе
Пусть есть следующие счета:
Код Наименование Порядок
3.3.3 Счет 3.3.3 1
2.2.2 Счет 2.2.2 2
1.1.1 Счет 1.1.1 3
Выполним следующий запрос:
ВЫБРАТЬ
ПланСчетов1.Код КАК Код,
ПланСчетов1.Наименование,
ПланСчетов1.Порядок
ИЗ
ПланСчетов.ПланСчетов1 КАК ПланСчетов1
УПОРЯДОЧИТЬ ПО
Код
На этом примере видно, что в случае упорядочивания по полю Код вместо него используется поле Порядок.
Оформление кода
Данным топиком я хочу поднять вопрос о качестве кода, независимо от используемого языка программирования. В топике я приведу пару советов и методик, которых придерживаются у нас в компании. Я не буду утверждать, что они являются верными, ведь у каждого есть свой вкус и свои предпочтения. Но все равно, в каждом кругу разработчиков, работающих вместе, существуют какие либо правила оформления кода.
Так же, не мало важно увидеть в комментариях ваши подходы и «любимый стиль».
Большинство советов в топике — вырезки из книги Макконнелла «Совершенный код» (Steve McConnell — «Code Complete»).
Многочисленные статистические исследования показывают, что среднестатистический программист проводит гораздо больше времени за чтением кода, а не его написанием. Читать код сложнее, чем писать его. Особенно если речь идет о чужом программном коде. Но вы можете серьезно облегчить работу себе и коллегам, если ваш код будет качественным, понятным. “Качество кода” довольно обширный термин, включающий в себя достаточно много разных аспектов, среди которых проектирование интерфейсов классов и методов, реализация методов, правильное взаимодействие классов и методов друг с другом, конвенции по форматированию и оформлению кода, именованию классов, методов и переменных, принятые в конкретной корпоративной среде.
Правило Ноль: строго следуйте code style «гайдам», принятым в вашей корпоративной среде.
Качественные методы
Метод должен служить одной четко определенной цели
Эта цель должна быть полностью отражена в его имени: получить текущего пользователя — getСurrentUser(). Размытое, неоднозначное и откровенно плохое имя метода чаще всего является
главным свидетельством его неудачной реализации.
Примеры хороших имен методов:
Customer::getFullName() – получить полное имя клиента UserMapper::createAndGetUser(userId) – исключение, в контексте User-маппера побочная роль метода (вернуть вновь созданный user-объект) достаточно очевидна.
MonthRevenue.calculate(), MonthRevenue.export() – неинформативные сами по себе имена методов оказываются полностью достаточными в контексте ООП вызовов этих методов «на себя» (другими словами, метод призван совершить действие над вызвавшим его объектом и его данными).
Примеры плохих имен методов:
computeMonthRevenueAndDoExport() – несколько несвязанных целей
processInput(), handleCalculation() – невыразительность, размытость цели
метода
setMonthExchangeRate(month, exchangeRate)
getCustomerMonthRevenue(customerId, month)
monthRevenue = fixedValue * 0.6 / inputParam
Качественные переменные
Переменная должна полно описывать представляемую сущность
Суть этого совета проста – любая переменная должна иметь понятное название, по которому можно судить
о ее предназначении. Бессмысленных и неочевидных переменных стоит избегать. Имя переменной должно характеризировать проблему реального мира, а не ее решение на языке программирования. Проще всего словами проговорить описываемую переменной сущность и назвать переменную соответствующими словами.
Умеренная длина
Название переменной не должно быть слишком кратким, чтобы вводить в заблуждение людей, но в это же время оно не должно быть и слишком длинным, так как это некрасиво с точки зрения чтения кода. Длина должна быть достаточной, чтобы не нужно было ломать голову.
Спецификаторы
В именах переменных следует использовать спецификаторы Count и Index вместо Num. Это логично, так как они четко отражают назначение переменной (количество и номер), а вот Num выглядит достаточно двусмысленно и может в некоторых случаях ввести в заблуждение.
Индексы циклов
Это нормально, когда небольшой цикл из 1-3 строк имеет индекс под названием I,j или k. Но если тело цикла заметно больше, то лучше давать индексам осмысленные имена. И вам будет проще разобраться с таким кодом со временем (сразу же становится понятно, что делает цикл) и другим программистам, которые будут работать с вашим кодом, тоже станет легче.
Префиксы при перечислениях
При использовании перечислений имеет смысл ставить префикс. Например, в случае таких переменных STATUS_OPENED, STATUS_TO_CONFIRM, STATUS_CONFIRMED перечисление идет с префиксом STATUS_.
Константы
При именовании констант следует использовать не конкретные числа, а абстрактные сущности, о которых идет речь. Это боле понятно с точки зрения читабельности кода и является хорошим стилем программирования.
Конвенции
Следует использовать конвенции именования переменных, которые будут известны всей команде программистов. Код должен быть единообразным. Так каждому участнику проекта будет гораздо проще в нем разобраться. И это приведет к повышению эффективности работы. Конвенция должна быть очевидной и доступной всем. И каждый разработчик должен придерживаться ее.
Меньше обобщенности
Называя переменную, старайтесь давать ей не слишком обобщенное имя. Идите в сторону конкретизации. Нужно четко представлять, для чего она предназначена. Даже если вам при обобщении это понятно, далеко не факт, что это будет очевидно для других разработчиков в вашей команде.
Примеры хороших имен переменных:
employeesCount, userMonthWorkDaysCount, yearTax, maxComputedSalary
Примеры плохих имен переменных:
Так же не мало важным является одинаковое оформление блоков кода, разбиение длинных условий на несколько строк и использование отступов.
Согласитесь, читать такой код:
Ссылка на книгу Code Complete.
Спасибо за внимание.
Объект 1С «Планы счетов»
Объект 1С «Планы счетов» — это прикладные объекты конфигурации, каждый из которых позволяет описать совокупность синтетических счетов, предназначенных для группировки информации о хозяйственной деятельности предприятия.
Путем настройки плана счетов организуется требуемая система учета; на план счетов ссылается регистр бухгалтерии.
Количество планов счетов в конфигурации не ограничено. Как правило, основной план счетов используется для бухгалтерского учета, а если требуется учет по иным стандартам (управленческий, МСФО и т.д.), то подключаются дополнительные планы счетов.
Счета в план могут быть добавлены как в конфигураторе (предопределенные), так и в пользовательском режиме.
План счетов может быть организован иерархично, ограничений по числу уровней вложенности нет.
Предопределенные планы счетов
Типовые решения, в состав которых входит подсистема бухгалтерского учета, поставляются с предопределенным планом счетов.
Как и любые предопределенные данные, эти счета можно отредактировать (добавить дополнительные счета) в режиме 1С:Предприятие, но нельзя удалить совсем.
Особенности работы с предопределенным планом счетов:
Структура объектов 1С «Планы счетов»
Планы счетов поддерживают многоуровневую иерархию «счет — субсчета»:
Количество уровней вложенности субсчетов в системе 1С:Предприятие 8 не ограничено.
Создание и редактирование счетов может выполняться:
По любому счету или субсчету возможно ведение аналитического учета. При создании и редактировании плана счетов требуемому счету или субсчету можно поставить в соответствие необходимое количество субконто — объектов аналитического учета.
Для того чтобы иметь возможность указания субконто для счетов, план счетов связывается с планом видов характеристик, в котором описаны виды субконто, применяемые для этого плана счетов.
Для каждого счета можно задать:
Также с каждым счетом и субсчетом может быть связан ряд дополнительной информации, которая хранится в реквизитах (например, это может быть признак, запрещающий использовать счет в проводках).
Особенности работы с планами счетов:
Как многие объекты информационной базы, каждый счет характеризуется кодом.
Код, как правило, имеет сложную структуру, например 90.01.1, что обусловлено традицией бухучета. На практике часто возникает прикладная задача упорядочить счета по коду, и в некоторых случаях это упорядочивание может сработать некорректно.
Например, есть счета 90.01.1, 90.01.2 и 90.01.12; в этом случае при прямой сортировке по коду последний из перечисленных субсчетов встанет в середину, а не на последнее место. Для исключения таких ситуаций, у счетов есть свойство «Порядок» — это «технический» код, по которому будет идти сортировка. Для правильной сортировки порядок у указанных субсчетов нужно выставить как 90.01.01, 90.01.12, 90.01.02.
По умолчанию свойство «Порядок» заполняется автоматически на основании кода, за это отвечает флаг «Автопорядок по коду».
Если флаг отключить, то значение реквизита «Порядок» нужно будет прописывать вручную.
Особенности работы с кодами счетов:
Каждый счет плана счетов должен характеризоваться кодом и наименованием. Для унификации (стандартизации) кода для плана счетов может быть задана маска.
Если пользователи не укажет какие-то символы, то платформа автоматически дозаполнит их нулями.
Возможные символы маски код счета:
Маска задается в настройках плана счетов.
Особенности работы с маской кода счета:
Субконто плана счетов
Субконто (от англ. subcount — субсчет) — термин из бухгалтерского учета, может иметь следующие значения:
Субконто к счету можно добавить:
Аналогично тому, как для плана счетов в целом могут быть добавлены признаки учета, для каждой аналитики можно задать признаки учета субконто:
Многие счета имеют подчиненные им субсчета.
Так, счету 01 (Основные средства) подчинены субсчета: 01.01 (ОС в организации), 01.03 (Арендованное имущество) и другие.
Если у счета имеются субсчета, то в программе его нельзя использовать в проводках, использовать можно только подчиненные ему субсчета.
Особенности работы с субконто планов счетов:
Признаки учета счетов
Признак учета счета — это аналитический разрез, который позволяет разделять данные и ограничивает ввод данных в регистре бухгалтерии по выбранному счету. Например, если счет не отмечен как «Валютный», то операций в валюте, отличной от основной, по нему провести нельзя.
Тип значения у признака счета может быть только «Булево».
Признаки учета задаются на закладке «Данные» плана счетов и затем становятся доступными на форме счета.
Счета могут иметь следующие признаки:
Особенности работы с признаками учета счетов:
Формы «Плана счетов» 1С
Для того чтобы пользователь мог просматривать и изменять данные, содержащиеся в плане счетов, система поддерживает несколько форм представления плана счетов.
Система может автоматически генерировать все нужные формы. Разработчик имеет возможность создать собственные формы, которые система будет использовать вместо форм по умолчанию.
Форма списка плана счетов
Форма списка плана счетов используется для просмотра данных, содержащихся в плане счетов, и позволяет:
Форма счета
Форма счета используется для просмотра и изменения отдельных счетов. Как правило, она представляет данные в удобном для восприятия и редактирования виде.
Форма выбора плана счетов
Форма выбора плана счетов предназначена для выбора конкретного счета из списка и, обычно, содержит минимальный набор информации, необходимой для выбора того или иного счета. Может использоваться, например, для выбора счета при создании бухгалтерской операции.
Добавить комментарий Отменить ответ
Для отправки комментария вам необходимо авторизоваться.
Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.
Алгоритм Хаффмана на пальцах
Вы вероятно слышали о Дэвиде Хаффмане и его популярном алгоритме сжатия. Если нет, то поищите информацию в интернете — в этой статье я не буду вас грузить историей или математикой. Сегодня я хочу просто попытаться показать вам практический пример применения алгоритма к символьной строке.
Примечание переводчика: под символом автор подразумевает некий повторяющийся элемент исходной строки — это может быть как печатный знак (character), так и любая битовая последовательность. Под кодом подразумевается не ASCII или UTF-8 код символа, а кодирующая последовательность битов.
К статье прикреплён исходный код, который наглядно демонстрирует, как работает алгоритм Хаффмана — он предназначен для людей, которые плохо понимают математику процесса. В будущем (я надеюсь) я напишу статью, в которой мы поговорим о применении алгоритма к любым файлам для их сжатия (то есть, сделаем простой архиватор типа WinRAR или WinZIP).
Идея, положенная в основу кодировании Хаффмана, основана на частоте появления символа в последовательности. Символ, который встречается в последовательности чаще всего, получает новый очень маленький код, а символ, который встречается реже всего, получает, наоборот, очень длинный код. Это нужно, так как мы хотим, чтобы, когда мы обработали весь ввод, самые частотные символы заняли меньше всего места (и меньше, чем они занимали в оригинале), а самые редкие — побольше (но так как они редкие, это не имеет значения). Для нашей программы я решил, что символ будет иметь длину 8 бит, то есть, будет соответствовать печатному знаку.
Мы могли бы с той же простотой взять символ длиной в 16 бит (то есть, состоящий из двух печатных знаков), равно как и 10 бит, 20 и так далее. Размер символа выбирается, исходя из строки ввода, которую мы ожидаем встретить. Например, если бы я собрался кодировать сырые видеофайлы, я бы приравнял размер символа к размеру пикселя. Помните, что при уменьшении или увеличении размера символа меняется и размер кода для каждого символа, потому что чем больше размер, тем больше символов можно закодировать этим размером кода. Комбинаций нулей и единичек, подходящих для восьми бит, меньше, чем для шестнадцати. Поэтому вы должны подобрать размер символа, исходя из того по какому принципу данные повторяются в вашей последовательности.
Для этого алгоритма вам потребуется минимальное понимание устройства бинарного дерева и очереди с приоритетами. В исходном коде я использовал код очереди с приоритетами из моей предыдущей статьи.
Предположим, у нас есть строка «beep boop beer!», для которой, в её текущем виде, на каждый знак тратится по одному байту. Это означает, что вся строка целиком занимает 15*8 = 120 бит памяти. После кодирования строка займёт 40 бит (на практике, в нашей программе мы выведем на консоль последовательность из 40 нулей и единиц, представляющих собой биты кодированного текста. Чтобы получить из них настоящую строку размером 40 бит, нужно применять битовую арифметику, поэтому мы сегодня не будем этого делать).
Чтобы лучше понять пример, мы для начала сделаем всё вручную. Строка «beep boop beer!» для этого очень хорошо подойдёт. Чтобы получить код для каждого символа на основе его частотности, нам надо построить бинарное дерево, такое, что каждый лист этого дерева будет содержать символ (печатный знак из строки). Дерево будет строиться от листьев к корню, в том смысле, что символы с меньшей частотой будут дальше от корня, чем символы с большей. Скоро вы увидите, для чего это нужно.
Чтобы построить дерево, мы воспользуемся слегка модифицированной очередью с приоритетами — первыми из неё будут извлекаться элементы с наименьшим приоритетом, а не наибольшим. Это нужно, чтобы строить дерево от листьев к корню.
Для начала посчитаем частоты всех символов:
Символ | Частота |
---|---|
‘b’ | 3 |
‘e’ | 4 |
‘p’ | 2 |
‘ ‘ | 2 |
‘o’ | 2 |
‘r’ | 1 |
‘!’ | 1 |
После вычисления частот мы создадим узлы бинарного дерева для каждого знака и добавим их в очередь, используя частоту в качестве приоритета:
Теперь мы достаём два первых элемента из очереди и связываем их, создавая новый узел дерева, в котором они оба будут потомками, а приоритет нового узла будет равен сумме их приоритетов. После этого мы добавим получившийся новый узел обратно в очередь.
Повторим те же шаги и получим последовательно:
Ну и после того, как мы свяжем два последних элемента, получится итоговое дерево:
Теперь, чтобы получить код для каждого символа, надо просто пройтись по дереву, и для каждого перехода добавлять 0, если мы идём влево, и 1 — если направо:
Если мы так сделаем, то получим следующие коды для символов:
Символ | Код |
---|---|
‘b’ | 00 |
‘e’ | 11 |
‘p’ | 101 |
‘ ‘ | 011 |
‘o’ | 010 |
‘r’ | 1000 |
‘!’ | 1001 |
Чтобы расшифровать закодированную строку, нам надо, соответственно, просто идти по дереву, сворачивая в соответствующую каждому биту сторону до тех пор, пока мы не достигнем листа. Например, если есть строка «101 11 101 11» и наше дерево, то мы получим строку «pepe».
Важно иметь в виду, что каждый код не является префиксом для кода другого символа. В нашем примере, если 00 — это код для ‘b’, то 000 не может оказаться чьим-либо кодом, потому что иначе мы получим конфликт. Мы никогда не достигли бы этого символа в дереве, так как останавливались бы ещё на ‘b’.
На практике, при реализации данного алгоритма сразу после построения дерева строится таблица Хаффмана. Данная таблица — это по сути связный список или массив, который содержит каждый символ и его код, потому что это делает кодирование более эффективным. Довольно затратно каждый раз искать символ и одновременно вычислять его код, так как мы не знаем, где он находится, и придётся обходить всё дерево целиком. Как правило, для кодирования используется таблица Хаффмана, а для декодирования — дерево Хаффмана.
Входная строка: «beep boop beer!»
Входная строка в бинарном виде: «0110 0010 0110 0101 0110 0101 0111 0000 0010 0000 0110 0010 0110 1111 0110 1111 0111 0000 0010 0000 0110 0010 0110 0101 0110 0101 0111 0010 0010 000»
Закодированная строка: «0011 1110 1011 0001 0010 1010 1100 1111 1000 1001»
Как вы можете заметить, между ASCII-версией строки и закодированной версией существует большая разница.
Приложенный исходный код работает по тому же принципу, что и описан выше. В коде можно найти больше деталей и комментариев.
Все исходники были откомпилированы и проверены с использованием стандарта C99. Удачного программирования!
Чтобы прояснить ситуацию: данная статья только иллюстрирует работу алгоритма. Чтобы использовать это в реальной жизни, вам надо будет поместить созданное вами дерево Хаффмана в закодированную строку, а получатель должен будет знать, как его интерпретировать, чтобы раскодировать сообщение. Хорошим способом сделать это, является проход по дереву в любом порядке, который вам нравится (я предпочитаю обход в глубину) и конкатенировать 0 для каждого узла и 1 для листа с битами, представляющими оригинальный символ (в нашем случае, 8 бит, представляющие ASCII-код знака). Идеальным было бы добавить это представление в самое начало закодированной строки. Как только получатель построит дерево, он будет знать, как декодировать сообщение, чтобы прочесть оригинал.