Какое количество строк в документе 1с можно
Таблица значений — специальный объект в программировании 1С 8.3 (8.2), который позволяет хранить промежуточные значения в виде двумерного массива со строками и колонками. Таблицы значений можно использовать как источник данных в запросе.
Таблицу значений, как любую коллекцию, можно обойти циклом. Например:
Получить нужную строку можно по индексу, например:
Индексы в 1С начинается с 0 (нуля).
Рассмотрим основные свойства и методы этого объекта на примерах.
Создание и использование таблиц значений 1С в примерах
Создать таблицу можно следующим образом:
Добавить колонки в таблицу значений 1С:
Крайне рекомендую указывать кроме первого еще и второй параметр — тип данных. Он поможет избежать некоторых ошибок.
После создания колонок добавим несколько новых строк и заполним колонки:
Получите 267 видеоуроков по 1С бесплатно:
Добавим еще одну колонку:
Которую мы можем заполнить одинаковыми значениями двумя способами — перебором таблицы или функцией ЗаполнитьЗначения:
Сообщим пользователю название первой в списке программы (индекс таблицы значений в 1С начинается с «0»:
Скопировать строку таблицы значений 1С, для примера — первую:
Поиск в таблице значений 1С с ценой «17400» с помощью структуры:
Сортировка программ в таблице по цене:
Количество строк в таблице:
Выгрузить колонку таблицы значений в массив 1С 8.3 или 8.2:
Чтобы удалить строку в таблице значений, нужно передать саму строку или индекс в метод «Удалить». Два варианта:
Полностью скопировать таблицу значений 1С можно так:
Просуммировать итог по колонке таблицы значений:
Свернуть таблицу можно так:
При этом в таблице останутся только различные значения из колонки «ВерсияПлатформы» с суммированными полями «Цена».
Ну и напоследок очистим строки таблицы значений 1С 8.3 (8.2) полностью:
И удалим все колонки:
Если Вы начинаете изучать 1С программирование, рекомендуем наш курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):
К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.
В таблицах значений существуют строки и колонки. У каждой строки есть индекс, он начинается с нуля. Таблицу значений можно создавать с различными колонками и добавлять в нее строки. По строкам в таблице можно делать выборку и поиск, устанавливать и получать значения, сортировать, группировать и удалять строки.
Как можно создать новую таблицу значений?
Как добавить новую колонку с определенным типом и заголовком?
- Имя (необязательный, тип Строка , по умолчанию пустая строка). Имя колонки.
- Тип (необязательный, тип ОписаниеТипов ). Объект, описывающий допустимые типы значений для колонки. Если параметр не указан, в колонке можно будет хранить значение любого типа.
- Заголовок (необязательный, тип Строка , по умолчанию пустая строка). Заголовок колонки таблицы значений. Используется при визуальном отображении таблицы значений.
- Ширина (необязательный, тип Число , по умолчанию ноль). Ширина колонки в символах. Используется при визуальном отображении таблицы значений.
Как добавить новые строки?
Как выгрузить результат запроса в таблицу значений?
Как обойти в цикле все строки таблицы значений?
Как сделать выборку строк в таблице значений с отбором?
- ПараметрыОтбора (обязательный, тип Структура ). Задает условия поиска: ключ структуры определяет имя колонки, по которой будет осуществляться поиск, а значение структуры — искомое значение.
Осуществляет поиск строк таблицы значений, отвечающих заданным условиям поиска. Возвращает массив строк таблицы значений, соответствующих условиям поиска. Метод эффективно использовать для выборки неуникальных значений.
Массив хранит ссылки на строки таблицы значений, то есть при изменении строки в таблице, значение в массиве тоже будет измененным.
Как выполнить сортировку?
Как вычислить итоги по колонке?
Как сделать копию таблицы значений?
Как свернуть таблицу значений по колонке и суммировать по количеству?
Метод Свернуть() сворачивает таблицу по колонке «Наименование» и суммирует колонку «Количество». Если существуют еще колонки, то они будут удалены.
- КолонкиГруппировок (обязательный, тип Строка ). Имена колонок, разделенные запятыми, по которым необходимо группировать строки таблицы значений.
- КолонкиСуммирования (необязательный, тип Строка ). Имена колонок, разделенные запятыми, по которым необходимо суммировать значения в строках таблицы значений.
Осуществляет свертку таблицы значений по указанным колонкам группировки. Строки, у которых совпадают значения в колонках, указанных в первом параметре, сворачиваются в одну строку. Значения этих строк, хранящиеся в колонках, указанных во втором параметре, накапливаются.
Списки колонок не должны пересекаться. Колонки, не вошедшие ни в один из списков колонок, после выполнения метода удаляются из таблицы значений.
- Если в колонке установлен тип и он единственный, то при суммировании будет предприниматься попытка преобразования значения к типу Число .
- Если колонке не присвоены типы, то в процессе суммирования будут принимать участие только значения, имеющие тип Число , значения других типов будут игнорироваться.
- Если в колонке несколько типов и среди них есть тип Число , то в процессе суммирования будут принимать участие только значения, имеющие тип Число , значения других типов будут игнорироваться.
- Если в колонке несколько типов и среди них нет типа Число , то результат суммирования будет 0, который будет присвоен в соответствующую колонку, где будет преобразован к значению по умолчанию для типа, установленного в колонке.
Как найти строку в таблице значений по значению?
- Значение (обязательный, тип Произвольный ). Искомое значение.
- Колонки (необязательный, тип Строка , по умолчанию пустая строка). Список имен колонок, разделенных запятыми, по которым производится поиск. Если параметр не указан, поиск осуществляется по всей таблице значений.
Осуществляет поиск значения в указанных колонках таблицы значений. Возвращает строку таблицы значений, в которой содержится искомое значение. Если значение не найдено, то возвращается значение Неопределено . Метод эффективно использовать для поиска уникальных значений.
Для определения количества строк таблицы значений используется метод Количество().
В переменной КоличествоСтрок в данном случае содержится значение 1. Работает метод для всех конфигураций. В управляемом приложении следует использовать его на Сервере.
Какое количество строк в документе 1с можно
Одним из существующих ограничений платформы 1С 8.3 является ограничение на количество строк табличной части.
Табличная часть документа не может содержать более 99 999 строк. Точнее будет сказать, что нельзя сохранить в базе данных более 99 999 строк табличной части.
Почему так сказать будет точнее? Потому что во время интерактивной работы с документом в табличной части может быть сколько угодно строк, но вот сохранить их все в базе данных в виде объекта типа ТабличнаяЧасть будет нельзя.
В связи с этим сам собой напрашивается выход: данные, которые должны быть в табличной части, в момент сохранения документа в базе данных, поместить в регистр сведений (непериодический, с независимым режимом записи), а после записи снова извлечь эти данные из регистра и поместить обратно в табличную часть.
Три шага для решения:
п.1. Перед записью документа в этот регистр сведений помещаются строки из ТЧ, а ТЧ очищается. Для этого используется обработчик события ПередЗаписью, размещенный в модуле объекта. (Примечание. Событие ПередЗаписью прикладного объекта отличается от события ПередЗаписью формы, связанной с этим прикладным объектом. Обработчик события в модуле формы вызывается при интерактивной записи, а обработчик в модуле объекта при любом способе записи элемента в базу данных.)
п.2. Сразу после записи документа эта ТЧ снова заполняется данными из регистра. Для этого в модуле формы размещают обработчик события ПослеЗаписиНаСервере
п.3. Предусматривается необходимость очистки регистра сведений от записей в случае пометки его на удаление. Так как регистр сведений имеет независимый режим записи, регистр не подчинен регистратору, то при пометке на удаление документа записи из регистра сами удалиться не могут. Поэтому им придется «помочь». В противном случае мы не сможем удалить документ — обработка «Удаление помеченных объектов» будет находить ссылки на удаляемый документ и отказываться его удалить.
Что делать, если строк в документе больше 99’999?
Сам расчет – это, свернутая таблица по материалам. И понятно, что в итоге мы имеем ну 1000-2000 разных материалов для выполнения работ. Но, эти пару тысяч материалов собираются путем агрегирования данных из нескольких сотен (и более) смет, т.е. нескольких тысяч сметных позиций, а также вложенных в них ресурсов.
Расчет выполняется в документе, поскольку результат должен быть сохранен, для дальнейшей отправки в обработку, тендер и т.д.
Для понимания пользователя, что расчет выполнен верно, требуется реализовать ряд возможностей:
- из формы документа, при нажатии на свернутой позиции материалов, вывести данные: Смета — Позиция / Ресурс – Количество;
- печать утвержденной формы расшифровки к данной материальной ведомости;
- при объединении, перемещении и других операциях со строками все расшифровки должны переходить к новым строкам владельцам и т.д.
Табличная часть и 99’999 строк
Собственно, с самого начала понятно, что сводную таблицу материалов храним в табличной части документа, поскольку она будет отображаться в момент открытия. И лучше для этого использовать штатные механизмы. Но, вот расшифровку сбора данных, с самого начала не было никакого желания хранить в табличной части. Да и на первом же эксперименте, на примере не самой большой материальной ведомости, мы поймали данное ограничение.
В результате был придуман обходной путь:
- регистр сведений, не подчиненный регистратору (сбор выполняется редко, при каждой перезаписи документа нет нужды перезаписывать регистр) с ведущим измерением ДокументСсылка.МатериальнаяВедомость (имя документа не важно);
- на форме при создании на сервере записываем пустое значение во временное хранилище с указанием уникального идентификатора формы:
- таким образом, получили постоянный адрес для хранения данных;
- гарантировали жизнь данного адреса, до момента закрытия формы.
- Маленькая деталь: чтение данных не обязательно делать при открытии, она может быть реализована порциями, согласно отбору, полученному на основании запроса пользователя.
Таким образом, кроме того, чтобы мы обеспечили хранение и чтение данных, мы к тому же, не помещаем их в реквизит формы, в конечном итоге облегчая «вес пакета данных формы» при обмене между клиентом и сервером. Хотя, мы нагружаем сервер, но кто его жалеет, да? Принимая во внимание, что с данным документом работу выполняет крайне ограниченный круг лиц, а для остальных есть отчеты и поэтому посчитали, что сервер нагрузку переживет.
Остается существенный вопрос, зачем мы храним данные расшифровки истории сбора сводной ведомости? Во-первых, периодически, в процессе формирования актов КС-2, нам необходимо выполнять чтение данных о реальной стоимости материалов согласно данной ведомости (она, к слову, подписывается с заказчиком). Наименования материалов могут меняться, строки объединяться, но в КС-2 мы должны показать информацию о сметном названии материала, позиции в данной ведомости и ценой согласованной с заказчиком (или субподрядчиком). Таким образом, регистр расшифровки выполняет не только роль хранения «истории», но и инструмента достаточно точного получения данных.
Реализация в коде
Модуль формы документа
Модуль объекта документа
Ну вот как то так.
Постскриптум
Мы понимаем, что могли бы использовать что-нибудь «стильное, модное, молодежное», внешнюю базу данных и может быть даже NoSQL. Но, у нас просто было мало времени на подумать и еще меньше времени на реализовать. Как всегда результат нужен был «здесь и вчера». Решение было создано очень быстро, запущено в работу и проходит анализ на предмет скрытых просчетов. Более того, не у всех заказчиков возможно использование сторонних БД, поэтому данный вопрос будет скорее всего повторно обсуждаться гораздо позже.
Повторюсь, решение возможно не уникальное и не лишенное недостатков. Поэтому прошу направить на путь истинный, если имеются дельные предложения.
Специальные предложения









- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
(2) Динамический список умеет в дерево
99к + строк в данных формы это абсурд, как ссылка на вх или что-то ещё:
1. Отобразить их невозможно, видимая часть списка это не так много строк
2. Если есть задача отражать изменения при записи, храни изменения в данных документа
3. Изменений больше 99к? Если да — взгляни на закрытие месяца, там тоже много изменений и ни кто не складывает их в ТЧ.ПС: Твоя проблема и её решение это одна большая ошибка.
- Скопировать ссылку
- Перейти
(6) 1. Отображать всю таблицу никто не собирался. Отображается только часть, имеющая отношение к текущей строке материала, тем более в момент «запроса» пользователя.
2. Изменять их напрямую пользователь не будет, он управляет материалами, а программа связанными с ними строками «истории» сбора данных.
3. Вот поэтому в тч хранить и не стали. Это ни к чему.Опять повторюсь, я кажется дал с самого начала достаточно информации для создания альтернативной структуры хранения.
- Скопировать ссылку
- Перейти
1. Пользователь, что-то делает с материалами
2. Это что-то сохраняется в документ
3. При записи/проведении рассчитываются изменения и куда-то складываютсяИз регистра сведений удаляется документ как измерение и устанавливается периодичность по регистратору
1. Создается и записывается документ
2. Все действия пользователя сразу пишутся в РС
3. Пока документ не проведен, активность записей — Ложь- Скопировать ссылку
- Перейти
(12) вот это другое дело ;), давай обсудим.
Предложение 1 по сути есть продолжение описанного в статье. После того, как данные были собраны, они могут быть изменены, вот эти изменения будут проанализированы и в расшифровку точечно внесены изменения.
Предложение 2 в принципе предложение рабочее. Есть один нюанс, пока не нажата кнопка «Записать» обычно пользователю считают что все изменения — это «вилами на воде писано». При обрыве соединения сохранятся изменения регистра, но данные объекта документа не изменяться. Или зависнут «неактивные» позиции и их придется как то потом подчищать.
- Скопировать ссылку
- Перейти
Если бы знал бизнес процесс, я бы выбрал №1, но что бы это обсуждать нужен контекст, у меня его нет, посему про предложение 2.
Почему и про нюансы:
1. Сам факт существования объекта иб при создании можно скрыть, для этого достаточно сделать отбор по какому-то его реквизиту в списке
2. При обрыве соединения пользователь не потеряет данных, можно будет дать возможность продолжить творчество с того места где он остановился.
3. Активность как свойство записи входит в индекс и по умолчанию не попадает в срезы, очистка данных может быть не оперативной.Самое главное:
1. Мы не сталкиваемся с ограничениями при масштабировании в большую сторону.- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
Вообще периодичность по регистратору и активность можно не использовать.
Документ и признак активности могут быть самостоятельными измерением, основная идея в следующем:
1. На форме пользователь видит данные полученные объектами с поддержкой чтения по курсору (РегистрСведенийСписок, ДинамическийСписок)
2. Изменения сразу фиксируются в базу данных
3. Окончательное принятие к учету происходит с использованием доп. признака активности.- Скопировать ссылку
- Перейти
Рассматривали вот такой вариант?
При создании документа генерировать новую ссылку документа и везде использовать её (при записи применять её). Соответсвенно вместо таблицы значений использовать динамический список с отбором по ссылке (реальной или сгенерированной при создании нового).PS: Увидел, что я не первый уже после отправки комметария :о)
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
(4) Именно поэтому и спросил рассматривали такой вариант или нет. Да, именно в вашем случае, когда может быть загружен большой объём и после этого велика вероятность отказа от записи, более логично времено хранить на клиенте. Но тогда мы увеличиваем требования на клиентскую часть (объём памяти и частично процессор на обработку) вместо того чтобы этим занимался сервер (вообще файл передать на сервер для загрузки). В случае с динамическим списком как минимум отпадает необходимость отработки частичного чтения. Возможность «отката» тоже реализовать на вскидку в голове пара способов крутится.
У каждого решения есть своя сфера применимости с плюсами и минусами.
ПС: При очистке регистра не нужно его читать. Можно сразу записывать набор после установки отбора.
ПС2: Не надо так резко воспринимать комметарии, этим только вызываете общий негатив.
- Скопировать ссылку
- Перейти
(13) маленькая поправка, на клиент весь набор собранных данных (все эти много строк) не передаются, они во временном хранилище остаются. У клиента есть адрес хранилища, и при необходимости через вызов сервера, он может получить ровно ту часть строк, которые в текущий момент необходимо отобразить.
В общем получается такая схема:
— если нажата кнопка «Заполнить», то считанные данные помещаются во временное хранилище. Клиент получает ответ что все собрано и таблицу только уникальных позиций материалов, а вся расшифровка остается на сервере. На клиенте никоим образом отражения она не находит.
— после записи документа,при повторном открытии, мы не сразу заполняем все данные расшифровки. Возможно пользователю она вообще не понадобится в процессе работы. Когда пользователь запрашивает необходимость расшифровки, именно эта часть считывается из регистра и дополняется в таблицу хранилища. Таким образом, мы его наполняем постепенно.Во всех случаях на клиенте остается только адрес хранилища и видимая часть уникального набора материалов.
Пс. да, это я уже увидел. Не знаю откуда такая привычка писать. Никогда не задумывался. Спасибо за указание ошибки.
Пс2. видимо спал вчера мало, прошу прощения у всех
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
- Скопировать ссылку
- Перейти
Идея хорошая. Возможно будут полезны замечания.
1) Обернув код записи набора записей в Попытку-Исключение в уже открытой транзакции записи документа получили возможность возникновения невосстановимой ошибки во «вложенной» транзакции. Комбинация адекватного сообщения пользователю, выдаваемого методом ОбщегоНазначенияКлиентСервер.СообщитьПользователю и пугающего диалога с «В данной транзакции уже происходили ошибки» — это не лучшее решение. Нужно выбрасывать возникшее исключение выше через ВызватьИсключение а не просто сообщать пользователю. Тогда этот метод записи данных можно использовать и в серверных алгоритмах вне интерактивного взаимодействия с пользователем.
2) Перед заполнением набора записей в методе ЗаписатьДанныеВременногоХранилища блокировка данных не нужна. Вы же не выполняете предварительного чтения чтобы новые данные писались на основе старых. И вы же не ставите такую блокировку в методе ОчиститьРегистрСведенийХранениеДанныхДокумента, где точно такой же код за исключением того, что цикл заполнения набора записей заменен на метод чтения из БД.
3) Зачем в методе ОчиститьРегистрСведенийХранениеДанныхДокумента вообще чтение из БД?
НаборЗаписей.Прочитать();
НаборЗаписей.Очистить();
НаборЗаписей.Записать(Истина);Вроде бы как в регистре большое количество данных. Зачем их читать на сервер 1С чтобы потом сразу очистить эти данные и снова записать? Здесь ничего кроме установки неявной разделяемой управляемой блокировки не произойдет. И думаю что метод чтения из БД кучи данных вызывается вовсе не с целью установить неявную блокировку. Таким образом этот вызов является ошибкой.
4) Регистр перезаписывается целиком для документа. Если нам нужно добавить данные к уже существующим или удалить только часть данных, то алгоритм придется менять, и в методе ЗаписатьДанныеВременногоХранилища придется все-таки добавлять предварительное чтение всего объема данных по документу из регистра. Чтобы затем поменять только часть записей. Это очень не оптимально, учитывая исходные условия задачи : большой объем данных по документу.
Если обеспечить идентификацию строк в документе в свернутой таблицы материалов (например добавить автозаполняемый реквизит с типом УникальныйИдентификатор или инкрементальный числовой идентификатор), то можно было бы сделать вторым измерением регистра идентификатор строки. В этом случае получили бы больше возможностей по независимому изменению расшифровки каждой строки.
- Скопировать ссылку
- Перейти
(11) спасибо за замечания все по делу. Действительно полезно.
1. Да, вы правы. Спасибо за подсказку, изменения будут внесены.
2. Использовать блокировку стало какой-то привычкой, причем видимо мозг уже отключается о причинах, зачем это делается. Так же согласен.
3. Чтение тоже ни к чему, согласен также.
4. Вот тут маленькая поправка. Выложил не всю информацию, сознательно ее упростив. Ваше замечание верно, и оно реализовано.
Регистр имеет структуру: Документ / Ключ строки / Смета / Ключ позиции сметы
Т.е. при необходимости можно перезаписать все данные, а можно по отдельным ключам, которые были изменены. Поскольку механизм взаимодействия пользователей сейчас в работе, процедура записи не была пока изменена. Но в будущем, когда из формы будут приходить данные об изменениях только отдельных групп строк, тогда будет реализована и запись части набора, без затрагивания остальных.- Скопировать ссылку
- Перейти
(14)
Если реализован регистр с измерениями Документ / Ключ строки / Смета / Ключ позиции сметы и данные действительно перезаписываются не целиком по измерению Документ , а по сочетанию измерений, то при запись данных в регистр сведений в методе ЗаписатьДанныеВременногоХранилища скорее всего идет внутри цикла, перебирающего комбинации измерений.В таком случае управляемая блокировка до начала записи действительно нужна. И тогда пункт 2 из замечаний надо вычеркнуть. Иначе параллельная транзакция читая данные в целом по документу может получить несогласованный набор данных, состоящий из части «новых» расшифровок строк и части «старых» расшифровок. Вообще тут думать надо исходя из того, возможно ли такое чтение в других сеансах.
Похожие публикации:
- Какой лучше выбрать принтер для дома лазерный или струйный отзывы
- Какой объем памяти можно адресовать 8 битным указателем если минимальный размер объекта 2 байта
- Какой программой пользуются астрологи
- Какой свет красного или фиолетового цвета оказывает большее давление на идеально отражающую
Особенности работы с форматами строк табличного документа
Табличный документ платформы 1С:Предприятия позволяет использовать различную ширину колонок для различных строк. В данном разделе рассказывается, каким образом использовать данную возможность, описываются некоторые особенности использования данной возможности.
Создание формата строк
Для того чтобы создать новый формат строк (сделать у некоторых строк собственную ширину колонок), достаточно выделить строки, у которых необходимо изменить ширину колонки, и при помощи мыши изменить размер любой колонки. После изменения размера будет выдан запрос на создание нового формата строк. В случае подтверждения создания нового формата строк, для выделенных строк будет создан новый формат, и в дальнейшем, при изменении размеров колонок в данных строках, будут изменяться размеры колонок только в данных строках, остальные строки при этом затрагиваться не будут.
Для программной установки формата строк для определенной области табличного документа, следует воспользоваться методом СоздатьФорматСтрок() . После вызова метода строки, которые входили в область, для которой вызывался метод, будут иметь новый формат строк.
Выделение и копирование
Табличный редактор платформы 1С:Предприятие не позволяет осуществлять выделение прямоугольных областей, в которые входят несколько строк с различными форматами. Для копирования части документа, в которой присутствует более чем один формат строк, следует выделять строки целиком. Для этого можно с помощью мыши выделить заголовки строк, которые необходимо скопировать, либо воспользоваться комбинацией клавиш Alt+Shift+Вверх/Вниз.
Если при копировании строк табличного документа будут скопированы строки, у которых был установлен собственный формат строк, то при вставке таких строк в табличный документ данные строки будут также иметь отдельный формат строк. В случае если в документе, в который происходит вставка строк из буфера обмена, уже присутствуют строки с таким же форматом, вставляемые строки будут иметь тот же формат, что и присутствующие строки. Т.е. если скопировать строку с собственным форматом строк и вставить в документ, из которого было осуществлено копирование, то в документе будет две строки с одним форматом, и при изменении ширин колонок, будут изменяться ширины колонок обеих строк.
Вся выше сказанная информация о копировании строк с установленным форматом актуальна и для программного вывода строк в табличный документ — выводимые строки, которые в исходном документе имели одинаковый формат строк, будут выведены в результирующий документ с одним форматом строк.
Экспорт
Если табличный документ содержит строки с различным форматом строк, при выводе его в формат Microsoft Excel, настройки ширин колонок будут потеряны. Для того чтобы передать файл табличного документа и при этом сохранить оформление, можно воспользоваться экспортом табличного документа в формат HTML.
Работа со строками в 1С 8.3

Строка в 1С:Предприятие – это базовый тип данных, представленный в виде строки в формате unicode. Тип «строка» доступна для работы в тонком клиенте, веб-клиенте, на сервере, толстом клиенте, внешнем соединении, мобильном приложении (клиент/сервер). Тип «строка» может быть передан между клиентом и сервером, может быть сериализован.
Данный объект может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту, определяется в пространстве имен . Имя типа XDTO: может быть любым из перечисленных: string, anySimpleType, anyURI, duration, gDay, gMonth, gMonthDay, gYear, gYearMonth, NOTATION.
Существует достаточно большой список функции работы со строками в 1С, перечень функций:
- СтрДлина
- СокрЛ
- СокрП
- СокрЛП
- Лев
- Прав
- Сред
- СтрНайти
- ВРег
- НРег
- ТРег
- Символ
- КодСимвола
- ПустаяСтрока
- СтрЗаменить
- СтрЧислоСтрок
- СтрПолучитьСтроку
- СтрЧислоВхождений
- СтрСравнить
- СтрНачинаетсяС
- СтрЗаканчиваетсяНа
- СтрРазделить
- СтрСоединить
- ПолучитьСклоненияСтроки
Представленные функции строк в 1С поддерживается платформой 8.3. Для платформ более ранних версий список функций может отличаться. Подробнее о функциях – во встроенной к языке справке.
Далее каждая функция будет рассмотрена более детально.
СтрДлина – функция возвращает длину строки (число).
Сигнатура (жирным курсивом выделены обязательные параметры):
МояСтрока = "Какой-то текст"; ДлинаСтроки = СтрДлина(МояСтрока); Сообщить(ДлинаСтроки); Сообщить(ТипЗнч(ДлинаСтроки));СокрЛ, СокрП, СокрЛП – эти функции очень похожи по своей сути, поэтому будут рассмотрены совместно. Функции убирают пробелы, переносы строк, перевод каретки слева (СокрЛ), справа (СокрП), слева и права (СокрЛП).
- тонкий клиент
- веб-клиент
- мобильный клиент
- сервер, толстый клиент
- внешнее соединение
- мобильное приложение (клиент)
- мобильное приложение (сервер)
МояСтрока = " Какой-то текст | "; МояСтрока2 = СокрЛ(МояСтрока); МояСтрока3 = СокрП(МояСтрока); МояСтрока4 = СокрЛП(МояСтрока); Сообщить(СтрШаблон("""%1""", МояСтрока2)); Сообщить(СтрШаблон("""%1""", МояСтрока3)); Сообщить(СтрШаблон("""%1""", МояСтрока4));Лев, Прав, Сред – данные функции также будут рассмотрены совместно. Функции получают определенное количество символов слева, справа, с середины строки. Результат выполнения – строка.
Сигнатура (жирным курсивом выделены обязательные параметры):
- Лев( , )
- Прав( , )
- Сред( , , )
- тонкий клиент
- веб-клиент
- мобильный клиент
- сервер
- толстый клиент
- внешнее соединение
- мобильное приложение (клиент)
- мобильное приложение (сервер)
МояСтрока = "Какой-то текст"; Сообщить(Лев(МояСтрока, 3)); Сообщить(Прав(МояСтрока, 3)); Сообщить(Сред(МояСтрока, 3, 4)); // если не указать параметр число символов, подстрока будет получена до конца строкиКак (Какой-то текст)
кст (Какой-то текст)
СтрНайти – Функция находит подстроку (первое вхождение) в строке с учетом регистра. Результат выполнения – строка.
Сигнатура (жирным курсивом выделены обязательные параметры):
- СтрНайти( , , , , )
- Строка – исходная строка;
- ПодстрокаПоиска – подстрока, которую нужно найти;
- НаправлениеПоиска – системное перечисление (СКонца, СНачала);
- НачальнаяПозиция – число. Указывает позицию в строке, с которой начинается поиск.
Если параметр не задан и в параметре НаправлениеПоиска указано значение СНачала, то значение по умолчанию равно 1.
Если параметр не задан и в параметре НаправлениеПоиска указано значение СКонца, то значение по умолчанию равно длине строки.
Допускаются значения от 1 до количества символов в строке, в которой выполняется поиск. Если указано значение, не входящее в диапазон, генерируется ошибка «Неверное значение параметра».
- НомерВхождения – Число. Номер вхождения подстроки в строку.
- тонкий клиент
- веб-клиент
- мобильный клиент
- сервер
- толстый клиент
- внешнее соединение
- мобильное приложение (клиент)
- мобильное приложение (сервер)
- интеграция
МояСтрока = "Какой-то текст, просто пробный текст"; Сообщить(СтрНайти(МояСтрока, "текст"));10 (Какой-то текст, просто пробный текст)
МояСтрока = "Какой-то текст, просто пробный текст"; Сообщить(СтрНайти(МояСтрока, "текст", НаправлениеПоиска.СКонца));32 (Какой-то текст, просто пробный текст)
МояСтрока = "Какой-то текст, просто пробный текст"; Сообщить(СтрНайти(МояСтрока, "текст". 2));32 (Какой-то текст, просто пробный текст)
МояСтрока = "Какой-то текст, просто пробный текст"; Сообщить(СтрНайти(МояСтрока, "т",, 7));10 (Какой-то текст, просто пробный текст)
ВРег, НРег, ТРег – данные функции будут рассмотрены совместно. Функции изменяют регистр строк. Верхний, нижний, каждое слово с заглавной буквы.
Сигнатура (жирным курсивом выделены обязательные параметры):
- тонкий клиент
- веб-клиент
- мобильный клиент
- сервер
- толстый клиент
- внешнее соединение
- мобильное приложение (клиент)
- мобильное приложение (сервер)
МояСтрока = "Какой-то текст"; Сообщить(ВРег(МояСтрока)); Сообщить(НРег(МояСтрока)); Сообщить(ТРег(МояСтрока));Символ – функция возвращает символ (строку) код которой был передан (код в формате unicode).
Сигнатура (жирным курсивом выделены обязательные параметры):
- тонкий клиент
- веб-клиент
- мобильный клиент
- сервер
- толстый клиент
- внешнее соединение
- мобильное приложение (клиент)
- мобильное приложение (сервер)
Сообщить(Символ(1072)); Сообщить(Символ(1073)); Сообщить(Символ(1074));КодСимвола – Функция обратная функции Символ, т.е. на вход принимает строку, возвращает код (число) символа в формате unicode.
Сигнатура (жирным курсивом выделены обязательные параметры):
- тонкий клиент
- веб-клиент
- мобильный клиент
- сервер
- толстый клиент
- внешнее соединение
- мобильное приложение (клиент)
- мобильное приложение (сервер)
Сообщить(КодСимвола("а")); Сообщить(КодСимвола("б")); Сообщить(КодСимвола("Слово", 4));ПустаяСтрока – функция проверяет, пустая ли строковая переменная, возвращает тип булево. Игнорируются пробелы, переносы строк, перенос каретки.
Сигнатура (жирным курсивом выделены обязательные параметры):
- тонкий клиент
- веб-клиент
- мобильный клиент
- сервер
- толстый клиент
- внешнее соединение
- мобильное приложение (клиент)
- мобильное приложение (сервер)
МояСтрока = "Какой-то текст"; МояСтрока2 = ""; МояСтрока3 = " "; МояСтрока4 = "Текст"; Сообщить(ПустаяСтрока(МояСтрока)); Сообщить(ПустаяСтрока(МояСтрока2)); Сообщить(ПустаяСтрока(МояСтрока3)); Сообщить(ПустаяСтрока(МояСтрока4));СтрЗаменить – функция заменяет все подстроки в строке.
Сигнатура (жирным курсивом выделены обязательные параметры):
- тонкий клиент
- веб-клиент
- мобильный клиент
- сервер
- толстый клиент
- внешнее соединение
- мобильное приложение (клиент)
- мобильное приложение (сервер)
МояСтрока = "Како/й-то/ т/ек/ст"; Сообщить(СтрЗаменить(МояСтрока, "/", ""));СтрЧислоСтрок – функция возвращает количество строк в многострочном документе, строки разделенные символом переноса строки.
Сигнатура (жирным курсивом выделены обязательные параметры):
- СтрЧислоСтрок( )
- тонкий клиент
- веб-клиент
- мобильный клиент
- сервер
- толстый клиент
- внешнее соединение
- мобильное приложение (клиент)
- мобильное приложение (сервер)
МояСтрока = "Какой-то текст |Какой-то текст |Какой-то текст"; Сообщить(СтрЧислоСтрок(МояСтрока));СтрПолучитьСтроку – Получения строки по номеру из многострочного документа.
Сигнатура (жирным курсивом выделены обязательные параметры):
- тонкий клиент
- веб-клиент
- мобильный клиент
- сервер
- толстый клиент
- внешнее соединение
- мобильное приложение (клиент)
- мобильное приложение (сервер)
МояСтрока = "Какой-то текст |Какой-то текст1 |Какой-то текст3"; Сообщить(СтрПолучитьСтроку(МояСтрока, 2));СтрЧислоВхождений – функция возвращает число вхождений подстроки в строку. Поиск регистронезависимый.
Сигнатура (жирным курсивом выделены обязательные параметры):
- тонкий клиент
- веб-клиент
- мобильный клиент
- сервер
- толстый клиент
- внешнее соединение
- мобильное приложение (клиент)
- мобильное приложение (сервер)
МояСтрока = "Какой-то текст |Какой-то текст1 |Какой-то текст3"; Сообщить(СтрЧислоВхождений(МояСтрока,"текст"));СтрСравнить – функция сравнивает строки без учета регистра. Возвращается число, если -1 – тогда первая строка меньше второй, 1 – первая строка больше второй, 0 – строки равны.
Сигнатура (жирным курсивом выделены обязательные параметры):
- тонкий клиент
- веб-клиент
- мобильный клиент
- сервер
- толстый клиент
- внешнее соединение
- мобильное приложение (клиент)
- мобильное приложение (сервер)
МояСтрока1 = "Какой-то текст"; МояСтрока2 = "Какой-то"; Если СтрСравнить(МояСтрока1, МояСтрока2) = 1 Тогда Сообщить(СтрШаблон("Строка ""%1"" больше ""%2""", МояСтрока1, МояСтрока2)); ИначеЕсли СтрСравнить(МояСтрока1, МояСтрока2) < 0 Тогда Сообщить(СтрШаблон("Строка ""%1"" меньше ""%2""", МояСтрока1, МояСтрока2)); ИначеЕсли СтрСравнить(МояСтрока1, МояСтрока2) = 0 Тогда Сообщить("Строки равны");Строка «Какой-то текст» больше «Какой-то»
СтрНачинаетсяС, СтрЗаканчиваетсяНа – определяют (с учетом регистра) начинается/заканчивается строка с определенной подстроки. Возвращает булево.
Сигнатура (жирным курсивом выделены обязательные параметры):
- тонкий клиент
- веб-клиент
- мобильный клиент
- сервер
- толстый клиент
- внешнее соединение
- мобильное приложение (клиент)
- мобильное приложение (сервер)
МояСтрока = "Какой-то текст"; Если СтрНачинаетсяС(МояСтрока, "как") Тогда Сообщить(СтрШаблон("""%1"" начинается с ""как""", МояСтрока)); КонецЕсли; Если СтрЗаканчиваетсяНа(МояСтрока, "ст") Тогда Сообщить(СтрШаблон("""%1"" заканчивается на ""ст""", МояСтрока)); КонецЕсли;«Какой-то текст» начинается с «как»
«Какой-то текст» заканчивается на «ст»
СтрРазделить – функция разбивает строку на подстроки, возвращается массив. Последний параметр определяет, нужно ли учитывать пустые строки, по умолчанию значение «Истина».
Сигнатура (жирным курсивом выделены обязательные параметры):
- тонкий клиент
- веб-клиент
- мобильный клиент
- сервер
- толстый клиент
- внешнее соединение
- мобильное приложение (клиент)
- мобильное приложение (сервер)
МояСтрока = "Какой-то текст, Какой-то текст,, Какой-то текст, Какой-то текст"; МассивПодстрок = СтрРазделить(МояСтрока, ",", Ложь); МассивПодстрок2 = СтрРазделить(МояСтрока, ","); Сообщить(ТипЗнч(МассивПодстрок)); Для Каждого Стр Из МассивПодстрок Цикл Сообщить(СтрШаблон("%1[%2]", Символы.Таб, Стр)); КонецЦикла;Если вывести МассивПодстрок2, результат будет таким:
СтрСоединить – функция противоположная СтрРазделить, т.е. склеивает подстроки в одну строку.
Сигнатура (жирным курсивом выделены обязательные параметры):
- тонкий клиент
- веб-клиент
- мобильный клиент
- сервер
- толстый клиент
- внешнее соединение
- мобильное приложение (клиент)
- мобильное приложение (сервер)
МояСтрока = "Какой-то текст, Какой-то текст,, Какой-то текст, Какой-то текст"; МассивПодстрок = СтрРазделить(МояСтрока, ",", Ложь); Сообщить(СтрСоединить(МассивПодстрок, "|"));Какой-то текст| Какой-то текст| Какой-то текст| Какой-то текст
ПолучитьСклоненияСтроки
Сигнатура (жирным курсивом выделены обязательные параметры):
- сервер
- толстый клиент
- внешнее соединение
МояСтрока = "токарь третьего разряда"; МассивВариантов = ПолучитьСклоненияСтроки(МояСтрока, "ПЛ=Мужской", "ПД=Дательный"); Сообщить(СтрСоединить(МассивВариантов, ", "));токарю третьего разряда
Строки в 1С
В этой статье изучим один из примитивных типов платформы 1С 8.3 – тип Строка. Научимся выводить строки, соединять, переносить, объединять с другими примитивными типами, а также узнаем, как работают строки в серверном и клиентском контексте, и научимся работать со строками на управляемой форме и в реквизитах объектов.
Строка в 1С
Строка это примитивный тип. Создать переменную типа строка достаточно просто. Нужно переменной присвоить какое-то значение в кавычках.
СтрокаА = "Привет";
Метод Сообщить в 1С
Самый простой вариант вывести какую-то строку, это использование процедуры Сообщить. Это процедура глобального контекста, которая выводит сообщение пользователю внизу формы.
В параметре этой процедуры указывается переменная с типом строка (или сама строка), которая будет выведена пользователю на форме.
СтрокаВывода = "Привет всем!"; Сообщить(СтрокаВывода);
Сообщить("Привет всем!");
Если мы код выше применим на какой-нибудь управляемой форме, то получим такое сообщение.

Как объединить строки в 1С
В платформе 1С 8.3 имеется возможность объединять строки. Эта операция называется конкатенация, и выполняется при помощи оператора +.
Можно объединить строки, просто сложив две строки в кавычках. Вот так
СтрокаА = "Начало строки " + "продолжение";
Также, можно сложить две переменных с типом строка.
СтрокаА = "Начало строки "; СтрокаБ = "Продолжение"; СтрокаС = СтрокаА + СтрокаБ;
Объединять можно и несколько строк.
СтрокаА = "Начало строки " + "продолжение " + " окончание строки" ;
Перенос строки в 1С
Все строки, которые мы делали ранее, представляли собой одну длинную строку, что, согласитесь, бывает иногда не совсем удобно. Чтобы не испытывать неудобства, в платформе 1С можно переносить строки, тем самым получая многострочные строки. Для этих целей имеется символ переноса строки – «|» (вертикальная черта).
Наша строка с переносом должна иметь следующий вид.
СтрокаСПереносом = "Первая строка |вторая строка |третья строка";
В случае переноса, после окончания ряда строки не должно быть ни каких символов, а каждая новая строка должна начинаться с символа переноса строки «|».
Если мы выведем эту строку с помощью уже знакомого нам метода Сообщить, то будет такой результат.

Причём, обращу ваше внимание, что не достаточно просто написать символ «|» в строке, нужно этот символ, именно, перенести на новую строку в коде. Поэтому при написании такой строки:
СтрокаСПереносом = "Первая строка | вторая строка | третья строка";
Будет выводиться неверный результат:

Кавычки в строке в 1С
Иногда необходимо внутри строки отобразить кавычку как символ, как это сделать, если у нас кавычка открывает или закрывает строку. Для того, чтобы в строке вывелась кавычка необходимо в строке написать две кавычки подряд.
СтрокаСКавычками = "Это справочник ""Номенклатура"" (для хранения номенклатуры)";
Будет выдавать следующий результат:

Пустая строка в 1С
А если нам нужно задать пустую строку? В этом случае достаточно просто написать две кавычки рядом, но так, чтобы между ними не было пробела.
То есть вот так.
НашаПустаяСтрока = "";
Также, в платформе 1С 8.3. имеется возможность проверить, является строка пустой или нет. Для этого необходимо воспользоваться функцией ПустаяСтрока, где в качестве параметра нужно указать проверяемую строку, а возвращает она Истину, или Ложь, в зависимости от того, пустая строка или нет.
НашаПустаяСтрока = ""; ЭтоСтрокаПустая = ПустаяСтрока(НашаПустаяСтрока);

Также, эта функция вернет Истина, если в строке одни пробелы.
НашаПустаяСтрока = " "; ЭтоСтрокаПустая = ПустаяСтрока(НашаПустаяСтрока);

В этом примере я воспользовался отладкой в коде.
Перевод примитивных типов в строку
Часто возникает задачи, когда нужно примитивный тип перевести в строку, это можно сделать, используя метод Формат, или просто применить метод глобального контекста Строка, где в качестве параметра указать значение примитивного типа. При помощи этого метода можно перевести число в строку, дату в строку и тип булево в строку.
В коде ниже, преобразуются число, булево значение Истина и дата (текущая дата) в строку, а потом все это выводится в сообщении.
НашеЧисло = 10; НашаБулево = Истина; ТекДата = ТекущаяДата(); СтрЧисло = Строка(НашеЧисло); СтрБулево = Строка(НашаБулево); СтрДата = Строка(ТекДата); Сообщить(СтрЧисло + " |" + СтрБулево + " |" + СтрДата);
У этого кода будет следующий результат:

Причем, в методе Сообщить мы можем в некоторых случаях указать и переменную не строкового типа.
НашеЧисло = 10; НашаБулево = Истина; ТекДата = ТекущаяДата(); Сообщить(НашеЧисло); Сообщить(НашаБулево); Сообщить(ТекДата);

Также можно операцией конкатенацией соединять переменную типа строка с примитивной переменной не строкового типа.
ТекДатаД = ТекущаяДата(); ТекДатаС = "Сейчас " + ТекДатаД; Сообщить(ТекДатаС);
Сообщить("Сейчас " + ТекущаяДата());
В обоих случаях код нормально отработается.

Конкатенацией мы можем соединить строку с другим примитивным типом, но не можем, к примеру, соединить дату и булево.
Рекомендую вам не злоупотреблять конкатенацией с другими типами, иногда это может приводить к критическим ошибкам.
Строка 1С в клиентском и серверном контексте
Переменную примитивного типа строка можно создать, как в серверном, так и в клиентском контексте. Такой код будет вполне рабочий.
&НаКлиенте Процедура НекаяПроцедура() СтрокаА = "Привет с клиента"; КонецПроцедуры &НаСервере Процедура НекаяПроцедураСервер() СтрокаБ = "Привет с сервера"; КонецПроцедуры
И также, для строк имеется возможность сериализации: т.е. можно перенести переменную с типом строка с клиента на сервер и наоборот:
Поэтому, и такой код будет вполне рабочим:
&НаКлиенте Процедура НекаяПроцедура() СтрокаА = "Привет с клиента"; НекаяПроцедураСервер(СтрокаА) КонецПроцедуры &НаСервереБезКонтекста Процедура НекаяПроцедураСервер(СтрокаПараметр) Сообщить(СтрокаПараметр); КонецПроцедуры
И наоборот, код также будет работать:
&НаСервереБезКонтекста Функция НекаяФункцияСервер() СтрокаДляВозврата = "Привет с сервера!"; Возврат СтрокаДляВозврата; КонецФункции &НаКлиенте Процедура НекаяПроцедура() СтрокаА = НекаяФункцияСервер(); Сообщить(СтрокаА) КонецПроцедуры
Таким образом, переменную с примитивным типом строка мы можем передать как с клиента на сервер, так и наоборот – с сервера на клиент.
Использование типа Строка в реквизитах объектов
Для того, чтобы реквизит какого-нибудь объекта имел тип Строка, достаточно просто указать этот тип в свойстве Тип нужного реквизита объекта.

У реквизита со свойством строка мы можем указать максимальную длину строки, а также будет длина строки фиксированная или переменная. Максимальная длина – это максимальное количество символов, которое можно вписать в строку.

Если мы укажем, что длина строки фиксированная, то длина строки реквизита объекта всегда будет приводиться к максимальной (заполняться пробелами).
Например, у реквизита ПолноеНаименование справочника Товары, я указал длину строки 10, и также отметил, что это фиксированная длина.

Если я запишу какое-то значение в поле формы, от оно автоматически заполнится пробелами до конца строки, и точно также с пробелами запишется в базу данных.

А если бы мы указали, что допустимая длинна – переменная.

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

Также у строки можно указать, что она имеет неограниченную длину

В этом случае в строку можно вписать любое количество символов. Рекомендуется крайне редко использовать свойство Неограниченная длина, поскольку это свойство не совсем положительно сказывается на производительности.
Использование типа строка на управляемой форме
Реквизит управляемой формы 1С также может иметь тип Строка. Достаточно это указать в свойстве Тип реквизита.

Причем нам нужно нажать на кнопку «…» свойства, чтобы получить доступ к дополнительным свойствам строки.

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

Если мы снимем признак неограниченности длинны строки, то сможем указать, какая будет строка – фиксированная или переменна.
Если мы перетащим реквизит в элементы формы, то будет создано поле ввода, в которое пользователь может вводить любую строковую информацию.

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

Другие статьи о примитивных типах:
Более подробно и основательно начальные вопросы программирования в 1С есть вы можете изучить в
Книга «Программировать в 1С за 11 шагов»Изучайте программирование в 1С в месте с моей книгой «Программировать в 1С за 11 шагов»

Книга написана понятным и простым языком — для новичка.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника.
О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.

- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Промо-код на скидку в 15% — 48PVXHeYu
Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog
Если Вам понравился этот урок, был полезен или помог решить какую-нибудь проблему, то Вы можете поддержать мой проект, перечислив любую сумму.можно оплатить вручную:
Яндекс.Деньги — 410012882996301
Web Money — R955262494655Вступайте в мои группы:
