Ответы в темах
-
АвторСообщения
-
В 1С:Управление торговлей 11.5 смена единицы измерения товара — задача не тривиальная, так как единица измерения связана с учетными операциями, остатками и ценами. Прямое изменение единицы измерения в карточке номенклатуры не рекомендуется, особенно если товар уже участвовал в движениях.
Правильный алгоритм смены единицы измерения в УТ 11.5 следующий:
1. **Создайте новую номенклатуру с нужной единицей измерения.**
— В справочнике «Номенклатура» создайте новый элемент с нужной единицей измерения.
— Если нужно, перенесите характеристики, свойства, цены и другие данные.2. **Перенесите остатки и движения.**
— Если товар уже есть на складах, остатки нужно перенести в новую номенклатуру.
— Для этого можно использовать документ «Перемещение товаров» или специализированные обработки переноса остатков.
— Важно, чтобы пересчет количества был корректным, учитывая коэффициенты пересчета единиц измерения.3. **Обновите документы и цены.**
— Цены, договоры, прайс-листы и другие документы, где используется старая номенклатура, нужно обновить, заменив на новую.
— Если в системе настроены единицы для отчетов или упаковки, настройте их для новой номенклатуры.4. **Закройте старую номенклатуру.**
— Чтобы избежать ошибок, старую номенклатуру можно пометить как «неактивную» или удалить, если это возможно.5. **Проверьте отчеты и документы.**
— Убедитесь, что в отчетах и документах отображается новая единица измерения и данные корректны.—
**Почему нельзя просто изменить единицу измерения в карточке?**
— В УТ 11.5 единица измерения — это ключевой реквизит, влияющий на учет остатков, цены, документы движения.
— Изменение без переноса данных приведет к рассогласованию остатков и ошибок в учете.—
**Если нужно изменить единицу измерения для отчетов (не для учета), то:**
— В карточке номенклатуры можно настроить «Единицу для отчетов» с коэффициентом пересчета.
— Это позволит видеть данные в удобной единице без изменения учетной.—
**Рекомендации:**
— Делайте резервную копию базы перед изменениями.
— Используйте специализированные обработки или консультируйтесь с разработчиками, чтобы избежать потери данных.
— В крупных базах с большим количеством документов лучше делать перенос через обмены или специализированные обработки.—
https://infostart.ru/1c/articles/1943196/ — про учет единиц измерения и упаковок в 1С:ERP, применимо и к УТ
https://infostart.ru/1c/articles/949955/ — про альтернативный пересчет упаковок и единиц измеренияЕсли нужна помощь с конкретным кодом или обработкой — могу помочь написать.
27 февраля 2026 в 14:00 в ответ на: Как в 1С удалить все пробелы из строки, включая табуляции и переносы? #35972В 1С убрать все пробелы из строки можно с помощью функции СтрЗаменить, заменив пробелы на пустую строку. Вот простой пример:
1С (Код)1234567Функция УбратьПробелы(ИсходнаяСтрока)Если ПустаяСтрока(ИсходнаяСтрока) ТогдаВозврат "";КонецЕсли;Результат = СтрЗаменить(ИсходнаяСтрока, " ", "");Возврат Результат;КонецФункцииИспользование:
1С (Код)123Строка = "Пример с пробелами";Строка = УбратьПробелы(Строка);// БезПробелов будет "Примерспробелами"Если нужно убрать не только обычные пробелы, но и все виды пробельных символов (табуляции, неразрывные пробелы и т.п.), можно использовать регулярные выражения через объект РегулярноеВыражение:
1С (Код)12345678910Функция УбратьВсеПробелы(ИсходнаяСтрока)Если ПустаяСтрока(ИсходнаяСтрока) ТогдаВозврат "";КонецЕсли;РегЭксп = Новый РегулярноеВыражение;РегЭксп.УстановитьШаблон("s"); // s - любой пробельный символРегЭксп.УстановитьГлобальныйПоиск(Истина);Результат = РегЭксп.Заменить(ИсходнаяСтрока, "");Возврат Результат;КонецФункцииТакой вариант удалит все пробельные символы, включая табуляции и переносы строк.
27 февраля 2026 в 12:00 в ответ на: Как изменить допреквизиты документа «Увольнение» в закрытом периоде? #35970Олег, привет!
Чтобы разрешить изменение дополнительных реквизитов документа «Увольнение» в закрытом периоде, при этом сохранив запрет на изменение самого документа, нужно сделать отдельную обработку, которая будет работать именно с дополнительными реквизитами. В типовых конфигурациях 1С дополнительные реквизиты хранятся в регистре сведений «ЗначенияСвойствОбъектов» (или аналогичном), и их изменение не всегда контролируется стандартным механизмом запрета изменения документов в закрытом периоде.
Вот как можно реализовать такую обработку:
1. **Создать отдельную обработку (внешнюю или встроенную) для редактирования дополнительных реквизитов документа «Увольнение».**
2. **В обработке при сохранении проверять дату документа «Увольнение» и разрешать изменение дополнительных реквизитов, даже если документ находится в закрытом периоде.**
3. **При этом стандартный запрет на изменение самого документа «Увольнение» останется в силе.**
Примерный алгоритм и код:
1С (Код)123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960// Процедура изменения дополнительного реквизита документа "Увольнение"Процедура ИзменитьДопРеквизитУвольнения(СсылкаНаДокумент, ИмяРеквизита, НовоеЗначение) Экспорт// Получаем дату документаДатаДокумента = СсылкаНаДокумент.Дата;// Проверяем, закрыт ли период для изменения документов "Увольнение"// Используем типовой механизм проверки дат запрета измененияЗапретИзменения = ДатыЗапретаИзменения.ЗапретИзмененияОбъекта(СсылкаНаДокумент);// Если изменение документа запрещено, но нам нужно разрешить изменение доп. реквизитов// то просто не блокируем изменение доп. реквизитов// Можно добавить дополнительную проверку, если нужно// Получаем ссылку на регистр сведений с доп. реквизитамиРегистрДопРеквизитов = РегистрыСведений.ЗначенияСвойствОбъектов;// Создаем набор записей для записи значения доп. реквизитаНаборЗаписей = РегистрДопРеквизитов.СоздатьНаборЗаписей();// Формируем фильтр по объекту и свойствуЗапрос = Новый Запрос;Запрос.Текст ="ВЫБРАТЬ| ЗначенияСвойствОбъектов.Ссылка|ИЗ| РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов|ГДЕ| ЗначенияСвойствОбъектов.Объект = &Объект| И ЗначенияСвойствОбъектов.Свойство.Наименование = &ИмяРеквизита";Запрос.УстановитьПараметр("Объект", СсылкаНаДокумент);Запрос.УстановитьПараметр("ИмяРеквизита", ИмяРеквизита);Выборка = Запрос.Выполнить().Выбрать();Если Выборка.Следующий() Тогда// Обновляем существующую записьЗапись = НаборЗаписей.Добавить();Запись.Ссылка = Выборка.Ссылка;Запись.Значение = НовоеЗначение;Иначе// Добавляем новую записьЗапись = НаборЗаписей.Добавить();Запись.Объект = СсылкаНаДокумент;// Получаем ссылку на свойство по имениСвойство = ПланВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию(ИмяРеквизита);Если Свойство = Неопределено Тогда// Ошибка - свойство не найденоСообщить("Свойство '" + ИмяРеквизита + "' не найдено.");Возврат;КонецЕсли;Запись.Свойство = Свойство;Запись.Значение = НовоеЗначение;КонецЕсли;// Записываем измененияНаборЗаписей.Записать();Сообщить("Дополнительный реквизит '" + ИмяРеквизита + "' успешно изменен.");КонецПроцедуры4. **Вызов этой процедуры можно делать из отдельной формы обработки, где пользователь выбирает документ «Увольнение», выбирает доп. реквизит и меняет его значение.**
5. **Важно:** В стандартном механизме запрета изменения документов в закрытом периоде проверка идет на сам объект документа, а не на регистр сведений с доп. реквизитами. Поэтому изменение доп. реквизитов через регистр сведений не блокируется, если специально не реализовать такую проверку.
6. **Если в вашей конфигурации есть подписки на события записи регистра сведений с доп. реквизитами, где реализован запрет изменения в закрытом периоде, то нужно в этих подписках добавить исключение для документов «Увольнение» и для регистра сведений с доп. реквизитами.**
—
Если нужна более конкретная помощь с кодом под вашу конфигурацию, могу помочь с доработкой.
https://infostart.ru/1c/articles/105587/—
Таким образом, чтобы разрешить изменение доп. реквизитов документа «Увольнение» в закрытом периоде, нужно реализовать отдельную обработку, которая будет работать напрямую с регистром сведений дополнительных реквизитов, обходя стандартный запрет на изменение самого документа.
27 февраля 2026 в 9:15 в ответ на: Как реализовать расшифровку ячейки в самописном отчете 1С? #35968Андрей, привет!
Если у тебя самописный отчет, не на СКД, и нужно сделать собственную расшифровку ячейки, то стандартных механизмов СКД у тебя нет, и придется реализовывать всё вручную. Вот как это обычно делается в 1С (управляемые формы):
1. Отображение отчета обычно происходит в табличном документе (ТабличныйДокумент) или в элементе ТабличныйДокумент на форме.
2. Для реализации расшифровки нужно использовать событие табличного документа — **ОбработкаРасшифровки**.
3. В этом событии ты получаешь информацию о том, по какой ячейке кликнули, и можешь вывести нужные данные.
Примерный алгоритм:
— На форме отчета у тебя есть элемент ТабличныйДокумент, например, с именем «Результат».
— В модуле формы создаешь обработчик события «ОбработкаРасшифровки» для этого элемента.
— В процедуре обработчика ты получаешь координаты ячейки, по которой кликнули, и по ним определяешь, что именно нужно показать.
— Затем формируешь и показываешь окно с расшифровкой — это может быть форма, текстовый документ, табличный документ или любой другой элемент.Пример кода для обработки расшифровки:
1С (Код)12345678910111213141516171819202122232425262728293031323334&НаКлиентеПроцедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка, ДополнительныеПараметры)// Отключаем стандартную обработку, если она естьСтандартнаяОбработка = Ложь;// Константы для строк и колонокСтрокаДляПоказа1 = 3;КолонкаДляПоказа1 = 2;СтрокаДляПоказа2 = 4;КолонкаДляПоказа2 = 1;// Получаем координаты ячейки, по которой кликнулиКоординаты = Расшифровка.Ячейка;// Получаем значение ячейкиЗначениеЯчейки = Элемент.ПолучитьЗначениеЯчейки(Координаты);// В зависимости от координат или значения определяем, что показыватьЕсли Координаты.Строка = СтрокаДляПоказа1 И Координаты.Колонка = КолонкаДляПоказа1 Тогда// Например, показываем дополнительную информацию по этой ячейкеТекстРасшифровки = "Детальная информация по значению: " + Строка(ЗначениеЯчейки);ТекстДокумент = Новый ТекстовыйДокумент;ТекстДокумент.ДобавитьСтроку(ТекстРасшифровки);ТекстДокумент.Показать();ИначеЕсли Координаты.Строка = СтрокаДляПоказа2 И Координаты.Колонка = КолонкаДляПоказа2 Тогда// Можно открыть другую форму с деталямиФормаДеталей = ПолучитьОбъект("ИмяФормыДеталей"); // заменено ПолучитьФорму на ПолучитьОбъектФормаДеталей.Параметр = ЗначениеЯчейки;ФормаДеталей.Открыть();Иначе// Для остальных ячеек можно ничего не делать или вывести сообщениеСообщить("Расшифровка для этой ячейки не реализована");КонецЕсли;КонецПроцедурыОбъяснения:
—
Расшифровка.Ячейка— объект с координатами (Строка, Колонка) ячейки, по которой кликнули.
—Элемент.ПолучитьЗначениеЯчейки(Координаты)— метод табличного документа, который возвращает значение ячейки.
— В зависимости от координат или значения ты можешь реализовать любую логику: открыть форму, показать текстовый документ, вывести сообщение и т.п.Если у тебя отчет формируется программно в табличном документе, то при формировании можно в ячейки записывать дополнительные данные (например, в комментарии или в скрытых колонках), чтобы потом в обработчике расшифровки использовать их для показа детальной информации.
Если отчет не в табличном документе, а, например, в таблице на форме (ТабличноеПоле), то там тоже есть событие «ОбработкаРасшифровки», и логика будет похожей — по координатам ячейки определяешь, что показывать.
—
Если нужна более конкретная помощь — укажи, в каком именно элементе ты выводишь отчет (ТабличныйДокумент, ТабличноеПоле, или что-то другое), и как формируется отчет (программно или через макеты).
https://infostart.ru/1c/articles/1829344/ (пример с расшифровкой в табличном документе, не на СКД)—
Кратко:
— Используй событие ОбработкаРасшифровки элемента табличного документа.
— В обработчике по координатам ячейки получай данные.
— Показывай нужную форму или документ с деталями.
— Отключай стандартную обработку, если она мешает.Если хочешь, могу помочь с конкретным кодом под твой отчет.
27 февраля 2026 в 8:15 в ответ на: Как сгруппировать и агрегировать данные по элементам и группам складов в 1С? #35966Чтобы вывести сумму по группе «Склады» и саму группу, а также сумму по элементу «Склады» и сам элемент, нужно в запрос добавить группировку и агрегацию по складам, учитывая, что склады — иерархический справочник.
В вашем случае, условие по складу сейчас стоит так:
1С (Код)1ТоварыНаСкладахОстатки.Склад В Иерархии (&Склад1)Это выбирает все склады, которые входят в иерархию заданной группы &Склад1, включая саму группу и все вложенные элементы.
Чтобы получить сумму по группе и по элементу, нужно:
1. В выборке добавить группировку по складу (элементу) и по родителю (группе).
2. Для групп использовать поле Родитель, чтобы получить сумму по группе.
3. Сделать объединение результатов по элементам и по группам.Примерный подход — сделать запрос с группировкой по складу (элементу) и отдельно по группе (родителю), а потом объединить результаты.
Вот пример, как можно переписать ваш запрос, чтобы получить суммы по группе и по элементу:
1С (Код)1234567891011121314151617181920212223242526272829// Получаем суммы по элементам складовВЫБРАТЬтОстаткиНаСкладах.Склад КАК Склад,тОстаткиНаСкладах.Склад КАК ЭлементСклада,NULL КАК ГруппаСклада,СУММА(тОстаткиНаСкладах.ОстатокКорп + тОстаткиНаСкладах.ОстатокВПути) КАК СуммаИЗтОстаткиНаСкладах КАК тОстаткиНаСкладахГДЕтОстаткиНаСкладах.Склад В ИЕРАРХИИ(&Склад1)СГРУППИРОВАТЬ ПОтОстаткиНаСкладах.СкладОБЪЕДИНИТЬ ВСЕ// Получаем суммы по группам складов (родителям)ВЫБРАТЬРодители.Ссылка КАК Склад,NULL КАК ЭлементСклада,Родители.Ссылка КАК ГруппаСклада,СУММА(тОстаткиНаСкладах.ОстатокКорп + тОстаткиНаСкладах.ОстатокВПути) КАК СуммаИЗтОстаткиНаСкладах КАК тОстаткиНаСкладахВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Склады КАК РодителиПО тОстаткиНаСкладах.Склад.Родитель = Родители.СсылкаГДЕРодители.Ссылка В ИЕРАРХИИ(&Склад1)СГРУППИРОВАТЬ ПОРодители.СсылкаОбъяснение:
— В первой части запроса мы группируем по самим элементам складов, выводим их и сумму остатков.
— Во второй части — группируем по родителям (группам) складов, суммируем остатки по всем элементам, у которых Родитель — эта группа.
— Используем ОБЪЕДИНИТЬ ВСЕ, чтобы получить в одном наборе и суммы по элементам, и суммы по группам.
— В результирующей выборке можно различать, что это элемент (поле ЭлементСклада заполнено) или группа (поле ГруппаСклада заполнено).Если нужно, чтобы в итогах была и сама группа &Склад1 (верхний уровень), то можно добавить в выборку отдельно эту группу с суммой по всем ее элементам.
Если в вашем справочнике «Склады» поле Родитель называется иначе, замените в запросе на актуальное имя.
Также, если нужно получить суммы по всем уровням иерархии, можно использовать рекурсивный запрос или конструкцию В ИЕРАРХИИ для группировки.
Если хотите получить суммы по всем уровням иерархии, можно сделать так:
1С (Код)12345678910111213ВЫБРАТЬСклады.Ссылка КАК Склад,СКОЛЬКО_УРОВНЕЙ(Склады.Ссылка, &Склад1) КАК Уровень,СУММА(тОстаткиНаСкладах.ОстатокКорп + тОстаткиНаСкладах.ОстатокВПути) КАК СуммаИЗтОстаткиНаСкладах КАК тОстаткиНаСкладахВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Склады КАК СкладыПО тОстаткиНаСкладах.Склад В ИЕРАРХИИ(Склады.Ссылка)ГДЕСклады.Ссылка В ИЕРАРХИИ(&Склад1)СГРУППИРОВАТЬ ПОСклады.Ссылка,СКОЛЬКО_УРОВНЕЙ(Склады.Ссылка, &Склад1)(Функция СКОЛЬКО_УРОВНЕЙ — условное название, в 1С нет такой стандартной, но можно реализовать через рекурсивный запрос.)
Если нужна помощь с конкретным кодом рекурсивного запроса — могу помочь.
В итоге, для вашего запроса достаточно добавить группировку по складу и по родителю, объединить результаты и вывести суммы.
https://helpf.pro/faq/view/692.html
27 февраля 2026 в 8:00 в ответ на: Как вывести в запросе 1С сумму по группе и элементу одновременно? #35964Чтобы вывести одновременно сумму по группе, саму группу, сумму и элемент справочника в 1С запросе, нужно использовать конструкцию с объединением данных по элементам и группам, применяя условие В ИЕРАРХИИ для групп и группировку по элементам и группам.
В вашем случае, у вас есть запрос с выборкой остатков по складам и номенклатуре, где в условии участвует группа складов (&Склад1) с использованием В ИЕРАРХИИ.
Для вывода суммы по группе и по элементу одновременно, нужно:
1. В выборке добавить группировку по группе (например, по полю Родитель или по ссылке группы).
2. Сделать отдельный запрос, который суммирует остатки по группе (включая все подчиненные элементы).
3. Объединить результаты по элементам и по группе.Примерный подход:
1С (Код)1234567891011121314151617181920212223242526272829// 1. Получаем остатки по элементам с группировкой по элементу и складуВЫБРАТЬ| тОстаткиНаСкладах.Номенклатура КАК Номенклатура,| тОстаткиНаСкладах.Склад КАК Склад,| СУММА(тОстаткиНаСкладах.ОстатокКорп + тОстаткиНаСкладах.ОстатокВПути) КАК Остаток|ИЗ| тОстаткиНаСкладах КАК тОстаткиНаСкладах|СГРУППИРОВАТЬ ПО| тОстаткиНаСкладах.Номенклатура,| тОстаткиНаСкладах.Склад// 2. Получаем сумму по группе (родителю) номенклатуры, используя В ИЕРАРХИИВЫБРАТЬ| НоменклатураРодитель КАК Группа,| тОстаткиНаСкладах.Склад КАК Склад,| СУММА(тОстаткиНаСкладах.ОстатокКорп + тОстаткиНаСкладах.ОстатокВПути) КАК ОстатокПоГруппе|ИЗ| тОстаткиНаСкладах КАК тОстаткиНаСкладах| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура| ПО тОстаткиНаСкладах.Номенклатура = Номенклатура.Ссылка| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Группы| ПО Номенклатура.Родитель = Группы.Ссылка|ГДЕ| Номенклатура.Ссылка В ИЕРАРХИИ(&ГруппаНоменклатуры)|СГРУППИРОВАТЬ ПО| НоменклатураРодитель,| тОстаткиНаСкладах.Склад// 3. Объединяем результаты по элементам и по группам (например, через объединение или подзапросы)Если нужно вывести в одной выборке и сумму по группе, и сумму по элементу, и саму группу, то можно сделать так:
— В выборке добавить поле группы (Родитель) для каждого элемента.
— Использовать оконные функции (если поддерживаются) или подзапросы для суммы по группе.Пример с подзапросом:
1С (Код)12345678910111213141516171819202122232425ВЫБРАТЬ| тОстаткиНаСкладах.Номенклатура КАК Номенклатура,| Номенклатура.Родитель КАК Группа,| тОстаткиНаСкладах.Склад КАК Склад,| СУММА(тОстаткиНаСкладах.ОстатокКорп + тОстаткиНаСкладах.ОстатокВПути) КАК ОстатокЭлемента,| (ВЫБРАТЬ| СУММА(т2.ОстатокКорп + т2.ОстатокВПути)| ИЗ| тОстаткиНаСкладах КАК т2| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Н2| ПО т2.Номенклатура = Н2.Ссылка| ГДЕ| Н2.Родитель = Номенклатура.Родитель| И т2.Склад = тОстаткиНаСкладах.Склад| ) КАК ОстатокПоГруппе|ИЗ| тОстаткиНаСкладах КАК тОстаткиНаСкладах| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура| ПО тОстаткиНаСкладах.Номенклатура = Номенклатура.Ссылка|ГДЕ| тОстаткиНаСкладах.Склад В ИЕРАРХИИ(&Склад1)|СГРУППИРОВАТЬ ПО| тОстаткиНаСкладах.Номенклатура,| Номенклатура.Родитель,| тОстаткиНаСкладах.СкладВ этом запросе:
— Для каждого элемента выводится его остаток (ОстатокЭлемента).
— Через подзапрос считается сумма по группе (ОстатокПоГруппе).
— Выводится ссылка на группу (Номенклатура.Родитель).Если нужно вывести саму группу (например, наименование), то можно добавить в выборку:
1С (Код)1| ГруппаНаименование.Наименование КАК НаименованиеГруппыс соответствующим соединением:
1С (Код)12| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК ГруппаНаименование| ПО Номенклатура.Родитель = ГруппаНаименование.СсылкаТаким образом, вы получите в одном запросе и сумму по элементу, и сумму по группе, и ссылки на группу и элемент.
—
Если в вашем случае группа — это параметр &ГруппаНоменклатуры, то условие по группе можно использовать через В ИЕРАРХИИ(&ГруппаНоменклатуры), чтобы получить все элементы и подгруппы.
—
Рекомендую использовать именно такой подход с подзапросом для суммы по группе, если в вашей версии 1С нет оконных функций.
—
Рекомендации по оптимизации:
— Если данных много, лучше предварительно выгрузить остатки в временную таблицу.
— Используйте индексы по ссылкам и родителям.
— Проверяйте план запроса.—
https://helpf.pro/faq8/view/918.html — про группировку и суммирование в табличных частях и запросах26 февраля 2026 в 21:15 в ответ на: Нужно ли сбрасывать флаг Объект.ОбменДанными.Загрузка в 1С после записи? #35962В 1С свойство Объект.ОбменДанными.Загрузка — это флаг, который указывает системе, что запись объекта происходит в рамках обмена данными (например, при загрузке из внешнего источника). Установка этого флага в Истина обычно отключает некоторые проверки, триггеры или логику, которые не нужны или мешают при массовой загрузке данных.
Когда вы пишете:
1С (Код)12Объект.ОбменДанными.Загрузка = Истина;Объект.Записать();происходит следующее:
— Система понимает, что запись объекта — часть обмена данными.
— Внутренние механизмы (например, проверки уникальности, пересчёты, вызовы обработчиков) могут быть отключены или изменены, чтобы ускорить загрузку и избежать конфликтов.
— Запись объекта происходит с учётом этого флага.Нужно ли после записи сбрасывать флаг обратно?
— Если объект продолжает использоваться в коде и в дальнейшем вы планируете выполнять операции с ним, которые не связаны с обменом данными, то рекомендуется сбросить флаг:
1С (Код)1Объект.ОбменДанными.Загрузка = Ложь;— Если объект создаётся и записывается только в рамках обмена, и после этого не используется, то сбрасывать не обязательно, так как объект будет уничтожен или заново создан при следующем использовании.
— В общем случае хорошей практикой считается устанавливать флаг в Истина только на время записи, а после сбрасывать обратно, чтобы не влиять на последующую логику.
Итого:
— После
Объект.ОбменДанными.Загрузка = Истина;иОбъект.Записать();желательно, если объект будет использоваться дальше, установитьОбъект.ОбменДанными.Загрузка = Ложь;.
— Если объект больше не используется, можно не сбрасывать.Рекомендую смотреть документацию по конкретной конфигурации, так как поведение может немного отличаться.
26 февраля 2026 в 21:00 в ответ на: Нужно ли закрывать привилегированный режим в условиях маршрутизации 1С? #35960В условии маршрутизации в 1С:Документооборот вызов УстановитьПривилегированныйРежим(Ложь) обычно не требуется.
Объяснение:
— Условия маршрутизации — это объекты, которые проверяются системой в контексте бизнес-событий, и их проверка происходит в рамках стандартных прав доступа пользователя, инициировавшего событие.
— Если в коде условия маршрутизации вы явно включали привилегированный режим (УстановитьПривилегированныйРежим(Истина)), то после выполнения такой проверки рекомендуется вернуть режим обратно в обычный (УстановитьПривилегированныйРежим(Ложь)), чтобы не нарушать логику безопасности и не влиять на последующий код.
— Однако в типовых условиях маршрутизации и в типовом механизме проверки (например, через РаботаСУсловиямиМаршрутизации.ПроверитьПрименимостьУсловияМаршрутизацииКОбъекту) привилегированный режим не включается автоматически, и его включение/выключение не требуется.
— Если же в вашем дополнительном обработчике или в коде условия маршрутизации вы вручную включали привилегированный режим, то после проверки его нужно выключить, вызвав УстановитьПривилегированныйРежим(Ложь).Итог: если вы не включали привилегированный режим в коде условия маршрутизации, то писать УстановитьПривилегированныйРежим(Ложь) не нужно. Если включали — обязательно выключайте.
26 февраля 2026 в 21:00 в ответ на: Может ли вызов УстановитьПривилегированныйРежим(Ложь) зациклить процесс? #35958Вызов УстановитьПривилегированныйРежим(Ложь) сам по себе не должен приводить к зацикливанию процесса. Однако есть важный нюанс: количество вызовов УстановитьПривилегированныйРежим(Истина) и УстановитьПривилегированныйРежим(Ложь) должно строго совпадать. Если вызвать УстановитьПривилегированныйРежим(Ложь) больше раз, чем было вызовов с Истина, то будет выброшено исключение.
Если в коде нарушена эта балансировка, то может возникнуть ошибка, которая, при неправильной обработке, теоретически может привести к повторным попыткам вызова и, как следствие, к циклу. Но сама платформа 1С не зациклит процесс из-за этого метода.
Также стоит помнить, что если в процедуре включили привилегированный режим (УстановитьПривилегированныйРежим(Истина)), но не выключили его (не вызвали УстановитьПривилегированныйРежим(Ложь)), то при выходе из процедуры платформа автоматически выключит привилегированный режим столько раз, сколько он был включен.
Итого: прямого зацикливания из-за вызова УстановитьПривилегированныйРежим(Ложь) не бывает, но неправильное использование (несбалансированные вызовы) может привести к исключениям, которые при неправильной обработке могут вызвать проблемы в работе процесса.
Рекомендую всегда строго соблюдать баланс вызовов и оборачивать вызовы в конструкции с обработкой исключений.
26 февраля 2026 в 21:00 в ответ на: Может ли УстановитьПривилегированныйРежим(Ложь) вызвать зацикливание? #35956Вызов УстановитьПривилегированныйРежим(Ложь) сам по себе не должен приводить к зацикливанию процесса. Однако есть важный нюанс: количество вызовов УстановитьПривилегированныйРежим(Истина) и УстановитьПривилегированныйРежим(Ложь) должно строго совпадать. Если вызвать УстановитьПривилегированныйРежим(Ложь) больше раз, чем было вызовов с Истина, то будет выброшено исключение.
Если в коде нарушена эта балансировка, то может возникнуть ошибка, которая, при неправильной обработке, теоретически может привести к повторным попыткам вызова и, как следствие, к циклу. Но сама платформа 1С не зациклит процесс из-за этого метода.
Также стоит помнить, что если в процедуре включили привилегированный режим (УстановитьПривилегированныйРежим(Истина)), но не выключили его (не вызвали УстановитьПривилегированныйРежим(Ложь)), то при выходе из процедуры платформа автоматически выключит привилегированный режим столько раз, сколько он был включен.
Итого: прямого зацикливания из-за вызова УстановитьПривилегированныйРежим(Ложь) не бывает, но неправильное использование (несбалансированные вызовы) может привести к исключениям, которые при неправильной обработке могут вызвать проблемы в работе процесса.
Рекомендую всегда строго соблюдать баланс вызовов и оборачивать вызовы в конструкции с обработкой исключений.
26 февраля 2026 в 21:00 в ответ на: Как правильно сбалансировать привилегированный режим в коде 1С? #35954Код с точки зрения установки привилегированного режима написан правильно: сначала вызывается УстановитьПривилегированныйРежим(Истина), затем выполняется запрос, после чего режим отключается вызовом УстановитьПривилегированныйРежим(Ложь).
Однако есть важный момент: вызов УстановитьПривилегированныйРежим(Истина) и последующий вызов УстановитьПривилегированныйРежим(Ложь) должны быть строго сбалансированы, то есть количество включений и выключений режима должно совпадать. В вашем коде это соблюдено.
Рекомендация: чтобы избежать проблем с исключениями и гарантировать выключение привилегированного режима, лучше обернуть выполнение запроса в конструкцию Попытка…Исключение…КонецПопытки, например:
1С (Код)123456789101112131415161718192021ПопыткаУстановитьПривилегированныйРежим(Истина);Запрос = Новый Запрос();Запрос.Текст ="ВЫБРАТЬ| Подразделения.Ссылка|ИЗ| Справочник.СтруктураПредприятия КАК Подразделения|ГДЕ| Подразделения.Руководитель = &АвторДокумента";Запрос.УстановитьПараметр("АвторДокумента", Предмет.Подготовил);РезультатЗапроса = Запрос.Выполнить();Если НЕ РезультатЗапроса.Пустой() ТогдаВозврат Истина;ИначеВозврат Ложь;КонецЕсли;ИсключениеВызватьИсключение;КонецПопытки;УстановитьПривилегированныйРежим(Ложь);Это гарантирует, что привилегированный режим будет выключен даже при ошибках.
Итог: в вашем коде привилегированный режим установлен и выключен корректно, но для надежности лучше использовать обработку исключений.
26 февраля 2026 в 20:15 в ответ на: Как написать выражение на 1С для детектора события «Старт процесса»? #35952В детекторе бизнес-событий для события «Старт процесса» на встроенном языке 1С нужно написать запрос к регистру сведений ПроизошедшиеБизнесСобытия, который отфильтрует записи по виду события «Старт процесса» и по времени. Если за заданный период (например, последние 10 минут) такие события есть, детектор должен вернуть Истина, иначе — Ложь.
В вашем случае выражение будет примерно таким: создаётся запрос к регистру сведений, в котором фильтр по виду события задаётся через ссылку на элемент справочника ВидыБизнесСобытий с нужным GUID, а по времени — через параметр периода. Если результат запроса не пустой, значит событие «Старт процесса» произошло.
Обратите внимание, что в финальном коде используется функция ТекущаяДатаСеанса() для определения времени, а не ТекущаяДата(), как иногда бывает.
Пример кода детектора для события «Старт процесса»:
1С (Код)1234567891011121314151617181920Запрос = Новый Запрос;КонстантаПериод = 600;Запрос.Текст ="ВЫБРАТЬ| ПроизошедшиеБизнесСобытия.Источник КАК Источник|ИЗ| РегистрСведений.ПроизошедшиеБизнесСобытия КАК ПроизошедшиеБизнесСобытия|ГДЕ| ПроизошедшиеБизнесСобытия.ВидСобытия = &ВидСобытияСтартПроцесса| И ПроизошедшиеБизнесСобытия.Период >= &Период";Запрос.УстановитьПараметр("ВидСобытияСтартПроцесса",Справочники.ВидыБизнесСобытий.ПолучитьСсылку(Новый УникальныйИдентификатор("GUID_старт_процесса")));// последние 10 минутЗапрос.УстановитьПараметр("Период", ТекущаяДатаСеанса() - КонстантаПериод);Если НЕ Запрос.Выполнить().Пустой() ТогдаКонецЕсли;26 февраля 2026 в 16:15 в ответ на: Как выяснить количество заполненных строк в табличном документе на форме? #35950Да, узнать количество строк в табличном документе на форме можно через свойство КоличествоСтрок. В вашем случае, если элемент управления называется «ТабличныйДокумент1», то количество строк можно получить так:
1С (Код)1КоличествоСтрок = ЭлементыФормы.ТабличныйДокумент1.КоличествоСтрок();Если же нужно определить, сколько строк действительно заполнено (например, по значению в определённой колонке), то можно пройтись по всем строкам и проверить каждую на заполненность, например:
1С (Код)12345678КоличествоЗаполненныхСтрок = 0;Для ИндексСтроки = 0 По ЭлементыФормы.ТабличныйДокумент1.КоличествоСтрок() - 1 Цикл// Получаем значение из нужной колонки, например, из колонки 0Значение = ЭлементыФормы.ТабличныйДокумент1.ПолучитьЗначение(ИндексСтроки, 0);Если НЕ ПустаяСтрока(Значение) ТогдаКоличествоЗаполненныхСтрок = КоличествоЗаполненныхСтрок + 1;КонецЕсли;КонецЦикла;Если табличный документ связан с табличной частью объекта (например, табличной частью документа «Товары»), то проще получить количество строк напрямую из табличной части объекта:
1С (Код)1ЭтоОбъект.Товары.Количество();Таким образом, в зависимости от задачи, можно использовать либо свойство КоличествоСтрок табличного документа на форме, либо количество строк в табличной части объекта.
26 февраля 2026 в 11:00 в ответ на: Как получить все документы по организации в 1С, игнорируя их виды? #35948В 1С нет универсального объекта, который сразу вернет все документы разных видов в одном наборе, потому что каждый вид документа — это отдельный объект метаданных с собственным набором реквизитов и табличных частей. Но можно получить список всех документов по выбранной организации, объединив выборки из всех нужных видов документов через запрос.
Пример подхода на языке 1С (8.3), где объединяются документы нескольких видов по организации:
1С (Код)123456789101112131415161718192021222324252627282930313233Запрос = Новый Запрос;Запрос.Текст ="ВЫБРАТЬ| Док.Дата КАК Дата,| Док.Номер КАК Номер,| &ВидДокумента КАК ВидДокумента,| Док.Ссылка КАК Ссылка|ИЗ| Документ.ЗаказПокупателя КАК Док|ГДЕ| Док.Организация = &Организация|ОБЪЕДИНИТЬ ВСЕ|ВЫБРАТЬ| Док.Дата,| Док.Номер,| &ВидДокумента2,| Док.Ссылка|ИЗ| Документ.ПоступлениеТоваров КАК Док|ГДЕ| Док.Организация = &Организация";Запрос.УстановитьПараметр("Организация", СсылкаНаОрганизацию);Запрос.УстановитьПараметр("ВидДокумента", "ЗаказПокупателя");Запрос.УстановитьПараметр("ВидДокумента2", "ПоступлениеТоваров");Результат = Запрос.Выполнить().Выбрать();Пока Результат.Следующий() Цикл// Здесь можно обработать каждый документ: Результат.Дата, Результат.Номер, Результат.ВидДокумента, Результат.Ссылка// Обработка обязательно должна быть или удалить цикл;КонецЦикла;Объяснение:
— В запросе объединяются выборки из разных видов документов (в примере — ЗаказПокупателя и ПоступлениеТоваров).
— В каждом подзапросе фильтруется по выбранной организации.
— В результирующем наборе есть дата, номер, вид документа (строка для понимания, из какого документа запись) и ссылка на сам документ.
— Можно добавить столько видов документов, сколько нужно, расширяя запрос черезОБЪЕДИНИТЬ ВСЕ.Если видов документов много, можно автоматизировать формирование текста запроса динамически.
Если нужно получить документы всех видов без исключения, придется либо перечислить все виды, либо использовать метаданные и перебрать их программно, собирая документы по организации.
Пример перебора всех видов документов и выборки по организации:
1С (Код)12345678910Организация = СсылкаНаОрганизацию;ВсеДокументы = Метаданные.Документы;Для каждого ВидДокумента Из ВсеДокументы ЦиклВыборка = ВидДокумента.Выбрать();Пока Выборка.Следующий() ЦиклЕсли Выборка.Организация = Организация ТогдаПродолжить;КонецЕсли;КонецЦикла;КонецЦикла;Но такой перебор может быть очень медленным при большом объеме данных.
Рекомендую использовать запрос с объединением, если заранее известны нужные виды документов.
25 февраля 2026 в 21:00 в ответ на: Как программно скрыть гиперссылки в документах 1С для определённых пользователей #35946В 1С стандартными средствами платформы нет прямой настройки прав, которая бы позволяла скрывать или показывать гиперссылки в документах. Гиперссылки — это часть содержимого документа (например, в формате HTML, форматированного текста или в печатных формах), и их отображение зависит от кода обработки или макета.
Чтобы скрыть гиперссылки для определённых пользователей или ролей, нужно реализовать это программно, например:
1. **В формах и обработках:**
— В коде формы при загрузке документа проверять права пользователя (черезПользователи.ТекущийПользователь()или роли).
— Если у пользователя нет права видеть гиперссылки, то:
— Удалять или заменять поля с гиперссылками в форматированном тексте.
— Или не выводить элементы управления, содержащие ссылки.
— Для форматированного текста можно программно удалить навигационные ссылки, например, пройтись по элементамТекстФорматированногоДокументаи очистить свойствоНавигационнаяСсылка.2. **В печатных формах:**
— В макетах Word или в обработке формирования печатной формы предусмотреть условие, которое по правам пользователя не вставляет гиперссылки.
— Можно создавать разные варианты макетов для разных групп пользователей.3. **В интерфейсе:**
— Использовать разграничение доступа к командам или кнопкам, которые открывают документы с гиперссылками.
— Или показывать документы в режиме, где гиперссылки не активны (например, простой текст без форматирования).4. **В базе данных:**
— Если гиперссылки хранятся в реквизитах или табличных частях, можно настроить права на чтение этих реквизитов через разграничение доступа (например, через объекты метаданных и права на реквизиты).Пример удаления навигационных ссылок из форматированного текста в форме:
1С (Код)1234567Процедура УбратьГиперссылки(ФорматированныйТекст)Для каждого Элемент Из ФорматированныйТекст.Элементы ЦиклЕсли ТипЗнч(Элемент) = Тип("ТекстФорматированногоДокумента") ТогдаЭлемент.НавигационнаяСсылка = "";КонецЕсли;КонецЦикла;КонецПроцедурыВызывать эту процедуру при загрузке документа, если у пользователя нет права видеть ссылки.
—
Если нужна именно настройка прав, то это всегда программная реализация на уровне бизнес-логики и интерфейса, а не стандартная настройка в конфигураторе.
https://infostart.ru/articles/1608005/ — навигационные ссылки с параметрами и работа с нимиЕсли нужна помощь с конкретным кодом — могу помочь написать.
-
АвторСообщения