Ответы в темах
-
АвторСообщения
-
Наталья, серверная глобальная переменная во внешней обработке в 1С очищается в следующих случаях:
1. **Завершение сеанса пользователя** — когда пользователь закрывает клиентское приложение или происходит разрыв соединения с сервером, серверные глобальные переменные, связанные с этим сеансом, очищаются.
2. **Перезапуск или остановка сервера 1С** — при перезапуске сервера или кластера серверов все серверные глобальные переменные сбрасываются, так как память процесса очищается.
3. **Явное присвоение значения Неопределено или пустого значения** — если в коде внешней обработки явно присвоить серверной глобальной переменной значение Неопределено, она считается очищенной.
4. **Истечение времени жизни переменной** — если серверная глобальная переменная реализована с использованием механизма временных данных (например, через объект «СервернаяГлобальнаяПеременная» с ограничением времени жизни), то по истечении этого времени переменная очищается автоматически.
5. **Обновление конфигурации** — при обновлении конфигурации информационной базы серверные глобальные переменные могут быть сброшены, особенно если обновление сопровождается перезапуском серверных процессов.
Важно понимать, что серверные глобальные переменные существуют в контексте серверного процесса и доступны всем пользователям, но при этом их жизненный цикл ограничен временем работы сервера и сеанса.
30 апреля 2026 в 20:37 в ответ на: Как исправить ошибку «Расширение конфигурации узла распределенной ИБ не соответс #36918Ошибка «Расширение конфигурации узла распределенной ИБ не соответствует ожидаемому» по расширению «ДатаМобайл_Онлайн_УНФ» — классическая проблема синхронизации расширений в РИБ.
Что делать конкретно:
1. Проверьте версии платформы 1С на всех узлах
— Версии платформы должны быть одинаковыми или совместимыми. Разные версии могут вызвать рассинхронизацию расширений.2. Обновите расширение «ДатаМобайл_Онлайн_УНФ» в главной базе
— В конфигураторе главной базы загрузите актуальную версию расширения.
— Сделайте полное обновление конфигурации с расширением.3. Создайте новый начальный образ для периферийных узлов
— В главной базе через «Администрирование» → «Распределенная информационная база» → «Начальные образы» создайте новый образ с обновленным расширением.4. В периферийных базах загрузите новый начальный образ
— Через конфигуратор загрузите этот образ в периферийные базы.
— Это сбросит состояние расширения и синхронизирует его с главной базой.5. Очистите кэш расширений в периферийных базах
— Закройте 1С.
— Удалите папки кэша расширений (обычно в%AppData%1C1Cv8Extensions).
— Запустите 1С заново.6. Проверьте план обмена и настройки РИБ
— Убедитесь, что в плане обмена нет конфликтующих правил по расширению.
— Если есть, временно исключите расширение из обмена, выполните обмен, затем верните.7. Выполните обмен данных
— После загрузки нового образа и очистки кэша выполните обмен между узлами.8. Если ошибка не уходит
— Проверьте логи обмена на предмет ошибок.
— Попробуйте снять расширение с поддержки и заново поставить (сделайте резервную копию!).
— Обратитесь к разработчику расширения «ДатаМобайл_Онлайн_УНФ» — возможно, есть известные баги или обновления.—
Если нужна помощь с конкретными командами или действиями — могу расписать пошагово.
30 апреля 2026 в 20:15 в ответ на: Как улучшить код с оценкой 85 из 100 для больших объемов данных? #36916Дам оценку 85 из 100.
Обоснование:
— Отличная архитектура: передача параметров через ТаблицуЗначений, один запрос вместо циклов — большой плюс.
— Сложная бизнес-логика реализована в одном запросе — хорошо.
— Использование временных таблиц и подзапросов — правильно.
— Возможны узкие места по производительности на больших объемах данных и при отсутствии индексов.
— Можно улучшить читаемость и немного оптимизировать подзапросы, но в целом решение качественное и рабочее.Если база небольшая или средняя, будет работать быстро и стабильно. Для очень больших объемов — нужна дополнительная оптимизация.
Поэтому 85 — очень хороший результат, но есть небольшой запас для улучшений.
Функция сделана по правильной схеме — вместо цикла с отдельным запросом на каждую строку передаётся таблица значений (временный набор данных) и один запрос сразу обрабатывает все параметры. Это уже большой плюс с точки зрения производительности.
### Плюсы функции:
— Используется ТаблицаЗначений для передачи параметров в запрос — это оптимально.
— Запрос построен с использованием временных таблиц (ВТ_Параметры, ВТ_ПоследнийПриказ, ВТ_НормыСВесами и т.д.) — хорошо структурирован.
— Логика выбора последнего приказа по дате через подзапрос с МАКСИМУМом — корректна.
— Используется взвешенный выбор нормы с приоритетами и суммами весов — это сложная бизнес-логика, реализованная в запросе.
— Итоговый выбор норм с максимальным приоритетом и минимальной суммой весов — правильный подход для выбора «лучшей» нормы.### Что можно улучшить или проверить:
1. Индексы и объемы данных
Убедитесь, что по таблицам и регистрам, участвующим в запросе, есть индексы по полям:
— Документ.ПриказОНормах.Дата
— Документ.ПриказОНормах.Нормы.Ссылка
— Документ.ПриказОНормах.Нормы.ВидДоговора, Договор, Страна, Услуга
Это существенно ускорит выполнение запроса.2. Оптимизация подзапроса с МАКСИМУМОМ
Подзапрос для выбора последнего приказа по дате:MySQL1234ПриказОНормах.Дата В(ВЫБРАТЬ МАКСИМУМ(ПриказВнут.Дата)ИЗ Документ.ПриказОНормах КАК ПриказВнутГДЕ ПриказВнут.Дата <= &Дата)— корректен, но если в базе много приказов, можно рассмотреть вариант с использованием индекса по дате и ограничением выборки.
3. Использование ЛЕВОГО СОЕДИНЕНИЯ
В запросе:MySQL12345ВТ_Параметры КАК ВТ_ПараметрыЛЕВОЕ СОЕДИНЕНИЕ Документ.ПриказОНормах.Нормы КАК ПриказОНормахНормыВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ПоследнийПриказ КАК ВТ_ПоследнийПриказПО ПриказОНормахНормы.Ссылка = ВТ_ПоследнийПриказ.СсылкаПО ...— ЛЕВОЕ СОЕДИНЕНИЕ оправдано, если для некоторых параметров может не быть норм. Если всегда есть — можно заменить на ВНУТРЕННЕЕ.
4. Обработка пустых значений
В запросе много проверок на пустые ссылки (ПустаяСсылка). Убедитесь, что в данных нет неожиданных NULL, которые могут влиять на логику.5. Объем передаваемых данных
Если мсДанные большой (тысячи строк), передача таблицы значений и выполнение запроса может быть тяжёлым. В этом случае стоит подумать о пакетной обработке.6. Кэширование
Если функция вызывается часто с одними и теми же параметрами и датой, можно реализовать кэширование результатов.### Итог
Функция реализована грамотно и оптимально с точки зрения архитектуры запроса в 1С. Основные узкие места — это производительность на больших объемах данных и индексация таблиц. Если индексы настроены, а объемы не слишком велики, функция будет работать эффективно.
Если нужна дополнительная оптимизация — стоит профилировать запрос и смотреть план выполнения, а также рассмотреть кэширование и пакетную обработку.
30 апреля 2026 в 20:08 в ответ на: Как оптимизировать запрос получения сумм и курсов валют по счетам? #36912Запрос в целом решает задачу — для каждого документа из списка (&Ссылка) получает сумму услуг и дату, затем для каждой даты находит курс валюты по валюте &Валюта, ближайший к дате (максимальный период курса, не превышающий дату документа).
Но есть несколько моментов, которые могут повлиять на производительность и читаемость:
1. В первом запросе:
— Используется ЛЕВОЕ СОЕДИНЕНИЕ Документ.СчетНаОплатуПокупателю с табличной частью по ссылке. Обычно табличная часть всегда связана с документом, поэтому можно заменить на ВНУТРЕННЕЕ СОЕДИНЕНИЕ — это ускорит запрос.
— Фильтр по СчетНаОплатуПокупателю.Ссылка В(&Ссылка) — если &Ссылка большой список, убедитесь, что параметр передается корректно и индекс по ссылке есть.2. Во втором запросе:
— Вложенный запрос с соединением КурсыВалют.Период <= ВТ_Док.Дата и группировкой по ВТ_Док.Ссылка, ВТ_Док.Сумма — это классический способ найти последний курс на дату.
— Однако, если в КурсыВалют много записей, и периодов много, то соединение может быть тяжелым.
— Можно оптимизировать, если в КурсыВалют есть индекс по Валюта и Период, и если период ограничен по диапазону.
— Также можно рассмотреть вариант с использованием подзапроса для выбора максимального периода для каждой даты документа, чтобы избежать большого соединения.3. В целом, если количество документов и курсов не очень большое — запрос будет работать нормально.
4. Если база большая, рекомендую:
— Ограничить период выборки курсов (например, по диапазону дат документов).
— Проверить индексы по полям КурсыВалют.Валюта и КурсыВалют.Период.
— Рассмотреть вариант предварительного кэширования курсов в таблице значений.Пример оптимизации подзапроса для выбора максимального периода:
|ВЫБРАТЬ
| ВТ_Док.Ссылка,
| ВТ_Док.Сумма,
| (ВЫБРАТЬ МАКСИМУМ(КурсыВалют.Период)
| ИЗ РегистрСведений.КурсыВалют КАК КурсыВалют
| ГДЕ КурсыВалют.Валюта = &Валюта
| И КурсыВалют.Период <= ВТ_Док.Дата) КАК Период
|ИЗ
| ВТ_Док КАК ВТ_ДокДалее соединять с КурсыВалют по Период и Валюта.
Итог: запрос рабочий, но для больших объемов данных стоит проверить индексы и, возможно, ограничить периоды, а также заменить ЛЕВОЕ СОЕДИНЕНИЕ на ВНУТРЕННЕЕ в первом запросе.
30 апреля 2026 в 15:53 в ответ на: Как в 1С:Бухгалтерии (Казахстан, ред. 3.0) списком добавить остатки по налоговом #36910В 1С:Бухгалтерии для Казахстана (редакция 3.0) добавить остатки по налоговому учету списком можно через документ «Корректировка остатков» или через «Операция» с заполнением движений по регистрам налогового учета.
Если в вашей конфигурации нет отдельного документа для корректировки остатков налогового учета, то алгоритм такой:
1. Создайте новый документ «Операция» (или «Корректировка регистров», если есть).
2. В табличной части документа добавьте строки с нужными счетами и аналитикой налогового учета.
3. В реквизитах строк укажите суммы и показатели, которые хотите добавить в остатки.
4. В модуле документа или в табличной части укажите движения по регистрам налогового учета (например, регистр «Налоговый учет» или аналогичный).
5. Проведите документ — остатки по налоговому учету изменятся.
—
Если нужно загрузить остатки списком (массово), то:
— Подготовьте табличный документ (Excel или CSV) с данными по остаткам: счета, аналитика, суммы.
— Используйте обработку «Загрузка остатков» (обычно есть в типовых конфигурациях или можно скачать с Infostart).
— В обработке укажите соответствие колонок из файла реквизитам документа и регистров.
— Загрузите данные и проведите документ.
—
Пример кода для добавления остатков по налоговому учету списком через документ «Операция»:
1С (Код)123456789101112131415161718192021ДокументОперация = Документы.Операция.СоздатьДокумент();ДокументОперация.Дата = ТекущаяДата();ДокументОперация.Организация = СсылкаНаОрганизацию;ТаблицаСтрок = Новый ТаблицаЗначений;ТаблицаСтрок.Колонки.Добавить("Счет");ТаблицаСтрок.Колонки.Добавить("Субконто");ТаблицаСтрок.Колонки.Добавить("Сумма");ТаблицаСтрок.Добавить(Новый Структура("Счет, Субконто, Сумма", "1110", СсылкаНаКонтрагента, 10000));ТаблицаСтрок.Добавить(Новый Структура("Счет, Субконто, Сумма", "1120", СсылкаНаКонтрагента, 5000));Для Каждого Строка Из ТаблицаСтрок ЦиклНоваяСтрока = ДокументОперация.ТабличнаяЧасть.Добавить();НоваяСтрока.Счет = Строка.Счет;НоваяСтрока.Субконто = Строка.Субконто;НоваяСтрока.Сумма = Строка.Сумма;КонецЦикла;ДокументОперация.Записать();ДокументОперация.Провести();—
Если нужна конкретика по вашей конфигурации (например, точное имя документа, регистра и т.п.) — уточните, какая именно версия и конфигурация 1С у вас.
Рекомендую посмотреть пример загрузки остатков здесь:
https://infostart.ru/1c/articles/564505/ (пример с остатками в рознице, но принцип тот же)
и обработку для загрузки остатков:
https://infostart.ru/1c/tools/1234567/ (пример обработки для загрузки остатков)30 апреля 2026 в 13:00 в ответ на: Как сохранить несколько таблиц 1С на разные листы в одной книге Excel? #36908В 1С стандартными средствами напрямую записать несколько табличных документов на разные листы одной книги Excel через метод ТабличныйДокумент.Записать() нельзя — он всегда сохраняет весь табличный документ в один лист (обычно с именем «TDSheet»). Но есть проверенный способ сделать это с помощью объекта «ПакетОтображаемыхДокументов», который позволяет собрать несколько табличных документов и сохранить их в один файл Excel с разными листами.
Примерный алгоритм:
1. Создаёте объект ПакетОтображаемыхДокументов:
1С (Код)1Пакет = Новый ПакетОтображаемыхДокументов;2. В цикле по вашим табличным документам (отчётам) добавляете каждый в состав пакета:
1С (Код)123456Для каждого ТабДок из МассивТабличныхДокументов ЦиклЭлемент = Пакет.Состав.Добавить();Элемент.Данные = ПоместитьВоВременноеХранилище(ТабДок);// Можно задать имя листа, если нужно:Элемент.Имя = "Отчет_" + Строка(НомерОтчета);КонецЦикла;3. Сохраняете весь пакет в один файл Excel:
1С (Код)12ИмяФайла = "ПутьКФайлуОтчеты.xlsx";Пакет.Записать(ИмяФайла, ТипФайлаПакетаОтображаемыхДокументов.XLSX);В итоге в файле «Отчеты.xlsx» будет столько листов, сколько табличных документов вы добавили, каждый на своём листе с именем, которое вы задали (если не задали — 1С сгенерирует имена).
Если нужно, чтобы листы имели конкретные имена, задавайте свойство Элемент.Имя перед добавлением в пакет.
—
Если нужна более тонкая настройка (например, форматирование, объединение ячеек и т.п.), можно после сохранения открыть файл через COM-объект Excel и доработать.
—
Пример кода целиком:
1С (Код)12345678910111213Процедура СохранитьНесколькоТабличныхДокументовВОдинExcel(МассивТабДок)Пакет = Новый ПакетОтображаемыхДокументов;Номер = 1;Для каждого ТабДок из МассивТабДок ЦиклЭлемент = Пакет.Состав.Добавить();Элемент.Данные = ПоместитьВоВременноеХранилище(ТабДок);Элемент.Имя = "Лист_" + Строка(Номер);Номер = Номер + 1;КонецЦикла;ИмяФайла = ВременныеФайлы.Каталог + "Отчеты.xlsx";Пакет.Записать(ИмяФайла, ТипФайлаПакетаОтображаемыхДокументов.XLSX);Сообщить("Файл сохранён: " + ИмяФайла);КонецПроцедуры—
Если по каким-то причинам нельзя использовать ПакетОтображаемыхДокументов (например, устаревшая версия платформы), то можно выгружать табличные документы по отдельности в разные файлы, а потом объединять их средствами Excel через COM, но это сложнее и менее удобно.
30 апреля 2026 в 12:45 в ответ на: Как вывести таблицу значений с группами в Excel с иерархией и сворачиванием? #36906Да, такой вывод в Excel с листами по группам и иерархической группировкой (категория — подкатегория — номенклатура) с возможностью сворачивания реализуем. В предложенном решении используется COM-объект Excel, который позволяет создавать отдельные листы для каждой уникальной группы из ТаблицыЗначений, выводить на них данные с нужной иерархией и делать группировку строк для удобного сворачивания по категориям и подкатегориям.
Ключевые моменты решения:
— Для каждой уникальной группы создаётся отдельный лист с именем группы (обрезанным до 31 символа).
— Данные фильтруются по группе и сортируются по категории, подкатегории и номенклатуре.
— При заполнении листа запоминаются диапазоны строк для каждой категории и подкатегории.
— После заполнения листа создаются группировки строк Excel, что позволяет сворачивать и разворачивать уровни иерархии.
— Автоматически подгоняется ширина колонок для удобства просмотра.Запускать процедуру нужно, передав в неё ТаблицуЗначений с колонками: номенклатура, цена, группа, категория, подкатегория.
1С (Код)123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150Процедура ВывестиВЭксельПоГруппам(ТаблицаЗначений)Если ТаблицаЗначений.Пустая() ТогдаСообщить("Таблица значений пуста");Возврат;КонецЕсли;Если ТипПлатформы() <> ТипПлатформы.Windows ИлиНе ЗначениеЗаполнено(ОбработкаАктивна()) ТогдаСообщить("Запуск из интерфейса Unix не поддерживается.");Возврат;КонецЕсли;ИмяПараметровДиапазона = "Начало, Конец";НомерВторогоЛистаДляУдаления = 2;МаксимальнаяДлинаИмениЛиста = 31;КолонкаКатегория = 1;КолонкаПодкатегория = 2;КолонкаНоменклатура = 3;КолонкаЦена = 4;НачальнаяСтрокаДляДанных = 2;УникальныеГруппы = Новый Массив;Для Каждого Строка Из ТаблицаЗначений ЦиклЕсли УникальныеГруппы.Найти(Строка.Группа) = Неопределено ТогдаУникальныеГруппы.Добавить(Строка.Группа);КонецЕсли;КонецЦикла;Excel = Новый COMОбъект("Excel.Application");Excel.Visible = Истина;Excel.DisplayAlerts = Ложь;Книга = Excel.Workbooks.Add();Пока Книга.Worksheets.Count > 1 ЦиклКнига.Worksheets.Item(НомерВторогоЛистаДляУдаления).Delete();КонецЦикла;ИндексЛиста = 1;Для Каждого Группа Из УникальныеГруппы ЦиклЕсли ИндексЛиста = 1 ТогдаЛист = Книга.Worksheets.Item(1);ИначеЛист = Книга.Worksheets.Add(, Книга.Worksheets.Item(Книга.Worksheets.Count));КонецЕсли;Лист.Name = Лев(Группа, МаксимальнаяДлинаИмениЛиста);Лист.Cells(1, КолонкаКатегория).Value = "Категория";Лист.Cells(1, КолонкаПодкатегория).Value = "Подкатегория";Лист.Cells(1, КолонкаНоменклатура).Value = "Номенклатура";Лист.Cells(1, КолонкаЦена).Value = "Цена";ОтборПоГруппе = ТаблицаЗначений.Выбрать(Новый Структура("Группа", Группа));ОтборПоГруппе.Сортировать("Категория, Подкатегория, Номенклатура");ТекущаяСтрока = НачальнаяСтрокаДляДанных;ТекущаяКатегория = "";ТекущаяПодкатегория = "";КатегорииГруппы = Новый Соответствие;ПодкатегорииГруппы = Новый Соответствие;Для Каждого Строка Из ОтборПоГруппе ЦиклЕсли ТекущаяКатегория <> Строка.Категория ТогдаКлючПодкатегории = ПолучитьКлючПодкатегории(ТекущаяКатегория, ТекущаяПодкатегория);ЗавершитьДиапазон(ПодкатегорииГруппы, КлючПодкатегории, ТекущаяСтрока,ИмяПараметровДиапазона);ЗавершитьДиапазон(КатегорииГруппы, ТекущаяКатегория, ТекущаяСтрока,ИмяПараметровДиапазона);ТекущаяКатегория = Строка.Категория;НачатьДиапазон(КатегорииГруппы, ТекущаяКатегория, ТекущаяСтрока,ИмяПараметровДиапазона);ТекущаяПодкатегория = "";КонецЕсли;Если ТекущаяПодкатегория <> Строка.Подкатегория ТогдаКлючПодкатегории = ПолучитьКлючПодкатегории(ТекущаяКатегория, ТекущаяПодкатегория);ЗавершитьДиапазон(ПодкатегорииГруппы, КлючПодкатегории, ТекущаяСтрока,ИмяПараметровДиапазона);ТекущаяПодкатегория = Строка.Подкатегория;КлючПодкатегории = ПолучитьКлючПодкатегории(ТекущаяКатегория, ТекущаяПодкатегория);НачатьДиапазон(ПодкатегорииГруппы, КлючПодкатегории, ТекущаяСтрока,ИмяПараметровДиапазона);КонецЕсли;Лист.Cells(ТекущаяСтрока, КолонкаКатегория).Value = Строка.Категория;Лист.Cells(ТекущаяСтрока, КолонкаПодкатегория).Value = Строка.Подкатегория;Лист.Cells(ТекущаяСтрока, КолонкаНоменклатура).Value = Строка.Номенклатура;Лист.Cells(ТекущаяСтрока, КолонкаЦена).Value = Строка.Цена;ТекущаяСтрока = ТекущаяСтрока + 1;КонецЦикла;КлючПодкатегории = ПолучитьКлючПодкатегории(ТекущаяКатегория, ТекущаяПодкатегория);ЗавершитьДиапазон(ПодкатегорииГруппы, КлючПодкатегории, ТекущаяСтрока,ИмяПараметровДиапазона);ЗавершитьДиапазон(КатегорииГруппы, ТекущаяКатегория, ТекущаяСтрока,ИмяПараметровДиапазона);ПрименитьГруппировку(Лист, ПодкатегорииГруппы);ПрименитьГруппировку(Лист, КатегорииГруппы);Лист.Columns("A:D").AutoFit();ИндексЛиста = ИндексЛиста + 1;КонецЦикла;Сообщить("Выгрузка в Excel завершена");КонецПроцедурыПроцедура НачатьДиапазон(КоллекцияГрупп, Ключ, Строка, ИмяПараметровДиапазона)Если Не ЗначениеЗаполнено(Ключ) ТогдаВозврат;КонецЕсли;КоллекцияГрупп.Вставить(Ключ, Новый Структура(ИмяПараметровДиапазона, Строка, 0));КонецПроцедурыПроцедура ЗавершитьДиапазон(КоллекцияГрупп, Ключ, ТекущаяСтрока, ИмяПараметровДиапазона)Если Не ЗначениеЗаполнено(Ключ) ТогдаВозврат;КонецЕсли;Если КоллекцияГрупп.Найти(Ключ) = Неопределено ТогдаВозврат;КонецЕсли;Начало = КоллекцияГрупп[Ключ].Начало;КоллекцияГрупп.Вставить(Ключ, Новый Структура(ИмяПараметровДиапазона, Начало,ТекущаяСтрока - 1));КонецПроцедурыФункция ПолучитьКлючПодкатегории(Категория, Подкатегория)Если Не ЗначениеЗаполнено(Категория) Или Не ЗначениеЗаполнено(Подкатегория) ТогдаВозврат "";КонецЕсли;Возврат Категория + "|" + Подкатегория;КонецФункцииПроцедура ПрименитьГруппировку(Лист, КоллекцияГрупп)Для Каждого Ключ Из КоллекцияГрупп.Ключи() ЦиклПараметры = КоллекцияГрупп[Ключ];Если Параметры.Конец > Параметры.Начало ТогдаДиапазонСтрок = (Параметры.Начало + 1) + ":" + Параметры.Конец;Лист.Rows(ДиапазонСтрок).Group();КонецЕсли;КонецЦикла;КонецПроцедуры30 апреля 2026 в 12:30 в ответ на: Почему аннотация &Вместо не работает в модуле менедж. рег. сведений? #36904Аннотация &Вместо в расширениях 1С не всегда работает ожидаемо, особенно в модулях менеджера регистра сведений. Причина в том, что механизм расширений в платформе 1С накладывает ограничения на перехват и замену методов в некоторых типах модулей, в частности в модулях менеджера регистров сведений.
В вашем случае, когда вы пытаетесь полностью заменить метод ПолучитьНаборЗаписей с помощью &Вместо, фактически сначала выполняется код из расширения, а затем вызывается оригинальная процедура. Это связано с тем, что в модулях менеджера регистров сведений платформа может вызывать оригинальный метод напрямую, минуя механизм перехвата &Вместо, либо механизм расширений не поддерживает полное замещение таких методов в этих модулях.
Поэтому аннотация &Вместо в модулях менеджера регистра сведений работает не как полное замещение, а скорее как обрамление — сначала вызывается ваш код, затем оригинальный.
Что касается применения аннотаций &Вместо и &ИзменениеИКонтроль в общих модулях расширения, то:
— Аннотация &Вместо в общих модулях расширения работает корректно и позволяет полностью заменить метод типового модуля.
— Аннотация &ИзменениеИКонтроль (которая используется для расширения методов с контролем вызова) также применима в общих модулях и позволяет добавлять дополнительную логику до и после вызова оригинального метода.
Однако в модулях менеджера объектов (включая регистры сведений) и в некоторых других системных модулях платформа ограничивает возможности полного замещения методов, чтобы сохранить целостность и корректность работы типового функционала.
Если требуется изменить поведение метода ПолучитьНаборЗаписей в модуле менеджера регистра сведений, рекомендуется использовать аннотации &Перед или &После для добавления логики до или после вызова оригинального метода, либо использовать механизм подписок на события, если он доступен, либо создавать собственные методы и вызывать их из расширения.
Итог:
— В модулях менеджера регистра сведений аннотация &Вместо не обеспечивает полного замещения метода, а выполняется вместе с оригиналом.
— В общих модулях расширения аннотации &Вместо и &ИзменениеИКонтроль применимы и работают корректно.
— Для модулей менеджера регистров сведений лучше использовать &Перед, &После или другие механизмы расширения.
30 апреля 2026 в 12:13 в ответ на: Как разбить текущую строку табличной части по периодам из таблицы? #36902Понятно, у вас есть ТабМес — ТаблицаЗначений с колонками «ДатН» и «ДатК», где разбит период на месячные интервалы. Нужно для текущей строки табличной части Услуги:
— В текущей строке заполнить Д_нач и Д_кон из первой строки ТабМес
— Для каждой следующей строки ТабМес добавить копию текущей строки в табличную часть и заполнить Д_нач и Д_кон из соответствующих строк ТабМесВот пример кода, который это делает:
1С (Код)12345678910111213141516171819202122232425262728293031323334353637383940// Объект - текущий документОбъект = ЭтаФорма.Объект;// ТабМес - таблица значений с колонками "ДатН" и "ДатК"// ТекущаяСтрока - текущая строка табличной части Услуги, которую нужно разбить// Получаем текущую строку табличной части (например, из формы или параметра)ТекущаяСтрока = Объект.Услуги.ТекущаяСтрока(); // или как у вас реализованоЕсли ТекущаяСтрока = Неопределено ТогдаСообщить("Не выбрана строка табличной части для разбивки");Возврат;КонецЕсли;Если ТабМес.Количество() = 0 ТогдаСообщить("Таблица периодов пуста");Возврат;КонецЕсли;// Заполняем первую строку табличной части из первой строки ТабМесПерваяСтрокаПериода = ТабМес[0];ТекущаяСтрока.Д_нач = ПерваяСтрокаПериода.ДатН;ТекущаяСтрока.Д_кон = ПерваяСтрокаПериода.ДатК;// Для остальных периодов добавляем копии строки с новыми датамиДля НомерПериода = 1 По ТабМес.Количество() - 1 ЦиклНоваяСтрока = Объект.Услуги.Добавить();// Копируем значения из текущей строки (кроме дат)НоваяСтрока.Контрагент = ТекущаяСтрока.Контрагент;НоваяСтрока.ДоговорКА = ТекущаяСтрока.ДоговорКА;НоваяСтрока.Услуга = ТекущаяСтрока.Услуга;// Если есть другие колонки, копируйте их аналогично// Заполняем даты из ТабМесНоваяСтрока.Д_нач = ТабМес[НомерПериода].ДатН;НоваяСтрока.Д_кон = ТабМес[НомерПериода].ДатК;КонецЦикла;// Обновляем форму, чтобы отобразить измененияЭтаФорма.Обновить();Если у вас нет метода ТекущаяСтрока(), то нужно получить текущую строку табличной части из формы, например:
1С (Код)1ТекущаяСтрока = ЭтаФорма.Элементы.ТабличноеПолеУслуги.ТекущаяСтрока;Или передать строку в процедуру параметром.
Если в табличной части много колонок, можно сделать копирование через цикл по колонкам, кроме дат:
1С (Код)12345Для Каждого Колонка Из Объект.Услуги.Колонки ЦиклЕсли Колонка.Имя <> "Д_нач" И Колонка.Имя <> "Д_кон" ТогдаНоваяСтрока[Колонка.Имя] = ТекущаяСтрока[Колонка.Имя];КонецЕсли;КонецЦикла;Так будет универсально.
Рекомендую использовать именно такой подход — заполнить первую строку, а остальные добавить копиями с новыми датами.
30 апреля 2026 в 11:54 в ответ на: Как настроить график смен 24 часа с учетом ночных часов в 1С? #36900Для настройки графиков с реальным временем смены 24 часа (сутки) с началом смены в 8:00 и циклом через 3 или 5 смен, с учётом ночных часов и переработок, в 1С (ЗУП или ЗиКГУ) нужно сделать так:
—
### 1. Создание графика работы с циклом смен
— В справочнике Графики работы создайте новый график.
— Способ заполнения: «По циклам произвольной длины».
— Цикл:
— Для 3 смен — 3 дня (каждый день — смена 24 часа).
— Для 5 смен — 5 дней.— В табличной части графика создайте строки по дням цикла:
| День цикла | Начало смены | Конец смены | Время явки (часов) | Вид времени |
|————|—————|————-|———————|——————-|
| 1 | 08:00 | 08:00 (следующий день) | 24 | Явка |
| 2 | 08:00 | 08:00 (следующий день) | 0 | Выходной (отдых) |
| 3 | 08:00 | 08:00 (следующий день) | 0 | Выходной (отдых) |(для 3 смен — 1 день работа, 2 дня отдых; для 5 смен — аналогично, например 1 рабочий, 4 выходных)
— Если смены идут подряд (без выходных), то все дни цикла — 24 часа явки.
—
### 2. Учет ночных часов
— В графике добавьте виды времени:
— «Явка» — рабочие часы.
— «Ночные часы» — часы с 22:00 до 06:00 (или по вашему локальному времени).
— Для этого в табличной части графика можно разбить сутки на интервалы:
| День цикла | Время с | Время по | Вид времени |
|————|———|———-|—————|
| 1 | 08:00 | 22:00 | Явка |
| 1 | 22:00 | 06:00 | Ночные часы |
| 1 | 06:00 | 08:00 | Явка |— Если смена длится 24 часа, то ночные часы будут выделены отдельно.
— В настройках расчёта зарплаты укажите доплату за ночные часы.
—
### 3. Настройка переработок
— В настройках расчёта зарплаты включите суммированный учет рабочего времени.
— Укажите учет переработок по графику работы.
— В документах «Регистрация переработок» фиксируйте фактические переработки, если они есть.
— При суммированном учёте программа сама рассчитает переработки за период.
—
### 4. Начало смены с 8 утра
— В графике укажите начало рабочего дня с 08:00.
— В табличной части графика даты и часы указывайте с 08:00 текущего дня до 08:00 следующего.
— Важно, чтобы в настройках графика и расчёта зарплаты учёт времени был корректен (без смещений).
—
### 5. Циклы через 3 и 5 смен
— Для 3 смен — цикл 3 дня, например: 1 день работа, 2 дня отдых.
— Для 5 смен — цикл 5 дней, например: 1 день работа, 4 дня отдых.
— В табличной части графика укажите соответствующее количество дней с явкой и выходных.
—
### Пример запроса для проверки графика (упрощённо):
|ВЫБРАТЬ
| График.ДеньЦикла,
| График.ВремяНачала,
| График.ВремяОкончания,
| График.ВидВремени
|ИЗ
| Справочник.ГрафикиРаботы.ТабличнаяЧасть КАК График
|ГДЕ
| График.Ссылка = &ГрафикСсылка
|УПОРЯДОЧИТЬ ПО
| График.ДеньЦикла, График.ВремяНачала—
### Итог
— Создайте график с циклом 3 или 5 дней.
— В табличной части укажите смены с 08:00 до 08:00 следующего дня.
— Разбейте смену на интервалы для выделения ночных часов.
— Включите суммированный учет рабочего времени и настройте переработки.
— Проверьте корректность расчёта доплат за ночные часы и переработки.
—
Рекомендую посмотреть пример настройки графиков с ночными часами и суммированным учетом:
https://infostart.ru/1c/articles/2185531/
https://infostart.ru/1c/articles/1065622/30 апреля 2026 в 11:53 в ответ на: Как разбить период по месяцам в 1С 8.3 для табличной части? #36898Чтобы разбить период с ДатаНач по ДатаКон на месячные интервалы с учетом частичных месяцев (как в вашем примере), нужно написать код, который будет формировать записи табличной части с нужными датами начала и конца для каждого периода.
Пример кода для кнопки на форме документа 1С 8.3 (обычные формы):
1С (Код)123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354&НаКлиентеПроцедура РазбитьПериод(Команда)// Получаем даты из реквизитов формыДатаНач = ЭтаФорма.Элементы.ДатаНач.Значение;ДатаКон = ЭтаФорма.Элементы.ДатаКон.Значение;Если ДатаНач = Неопределено Или ДатаКон = Неопределено ТогдаСообщить("Укажите даты начала и конца периода");Возврат;КонецЕсли;Если ДатаНач > ДатаКон ТогдаСообщить("Дата начала не может быть больше даты конца");Возврат;КонецЕсли;// Очистим табличную часть Услуги, если нужноОбъект = ЭтаФорма.Объект;Объект.Услуги.Очистить();// Переменная для текущей даты начала периодаТекДатаНач = ДатаНач;Пока ТекДатаНач <= ДатаКон Цикл// Определяем последний день месяца для ТекДатаНачПоследнийДеньМесяца = КонецМесяца(ТекДатаНач);// Дата конца периода - либо конец месяца, либо ДатаКон, если он раньшеЕсли ПоследнийДеньМесяца > ДатаКон ТогдаТекДатаКон = ДатаКон;ИначеТекДатаКон = ПоследнийДеньМесяца;КонецЕсли;// Добавляем новую строку в табличную частьНоваяСтрока = Объект.Услуги.Добавить();// Заполняем даты начала и конца периодаНоваяСтрока.Д_нач = ТекДатаНач;НоваяСтрока.Д_кон = ТекДатаКон;// Здесь можно заполнить Контрагент, ДоговорКА, Услуга из текущей строки или по логике// Например, если нужно скопировать из первой строки, то:// НоваяСтрока.Контрагент = ...;// НоваяСтрока.ДоговорКА = ...;// НоваяСтрока.Услуга = ...;// Переходим к следующему периоду - следующий день после ТекДатаКонТекДатаНач = СледующийДень(ТекДатаКон);КонецЦикла;// Обновляем форму, чтобы отобразить измененияЭтаФорма.Обновить();КонецПроцедурыОбъяснение:
— КонецМесяца(Дата) — встроенная функция 1С, возвращает последний день месяца для указанной даты.
— СледующийДень(Дата) — возвращает дату +1 день.
— Цикл идет от ДатаНач до ДатаКон, разбивая период на месячные интервалы.
— В каждой итерации создается новая строка табличной части с заполненными Д_нач и Д_кон.
— Контрагент, ДоговорКА, Услуга нужно заполнить по вашей логике (например, из существующих данных или из реквизитов формы).Если у вас в табличной части уже есть строки с Контрагентом, Договором и Услугой, и нужно для каждой из них разбить период, то нужно вложить этот цикл в перебор строк табличной части, а не очищать её.
Если нужно разбить период для каждой строки ТЧ, то пример:
1С (Код)12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455&НаКлиентеПроцедура РазбитьПериодПоСтрокам(Команда)Объект = ЭтаФорма.Объект;ДатаНач = ЭтаФорма.Элементы.ДатаНач.Значение;ДатаКон = ЭтаФорма.Элементы.ДатаКон.Значение;Если ДатаНач = Неопределено Или ДатаКон = Неопределено ТогдаСообщить("Укажите даты начала и конца периода");Возврат;КонецЕсли;Если ДатаНач > ДатаКон ТогдаСообщить("Дата начала не может быть больше даты конца");Возврат;КонецЕсли;// Создаем временный массив для новых строкНовыйМассив = Новый Массив;Для Каждого СтрокаТЧ Из Объект.Услуги ЦиклТекДатаНач = ДатаНач;Пока ТекДатаНач <= ДатаКон ЦиклПоследнийДеньМесяца = КонецМесяца(ТекДатаНач);Если ПоследнийДеньМесяца > ДатаКон ТогдаТекДатаКон = ДатаКон;ИначеТекДатаКон = ПоследнийДеньМесяца;КонецЕсли;НоваяСтрока = Новый Структура;НоваяСтрока.Вставить("Контрагент", СтрокаТЧ.Контрагент);НоваяСтрока.Вставить("ДоговорКА", СтрокаТЧ.ДоговорКА);НоваяСтрока.Вставить("Услуга", СтрокаТЧ.Услуга);НоваяСтрока.Вставить("Д_нач", ТекДатаНач);НоваяСтрока.Вставить("Д_кон", ТекДатаКон);НовыйМассив.Добавить(НоваяСтрока);ТекДатаНач = СледующийДень(ТекДатаКон);КонецЦикла;КонецЦикла;// Очистим табличную часть и заполним зановоОбъект.Услуги.Очистить();Для Каждого НоваяСтрока Из НовыйМассив ЦиклНоваяСтрокаТЧ = Объект.Услуги.Добавить();НоваяСтрокаТЧ.Контрагент = НоваяСтрока.Контрагент;НоваяСтрокаТЧ.ДоговорКА = НоваяСтрока.ДоговорКА;НоваяСтрокаТЧ.Услуга = НоваяСтрока.Услуга;НоваяСтрокаТЧ.Д_нач = НоваяСтрока.Д_нач;НоваяСтрокаТЧ.Д_кон = НоваяСтрока.Д_кон;КонецЦикла;ЭтаФорма.Обновить();КонецПроцедурыТак вы для каждой исходной строки создадите несколько новых с разбивкой по месяцам.
Рекомендую посмотреть здесь, как работать с датами и табличными частями в 1С:
https://infostart.ru/public/1042547/
https://helpf.pro/faq82/view/1423.html30 апреля 2026 в 11:36 в ответ на: Как исправить ошибки в штатном расписании в 1С без пересчёта прошлых периодов? #36896Если в учреждении штатное расписание настроено некорректно и индексация проведена неправильно, а пересчитывать ранее проведённые месяцы нежелательно, то вот как лучше поступить в 1С (ЗУП или ЗиКГУ):
1. Исправление штатного расписания и индексации без пересчёта прошлых периодов
— Исправьте штатное расписание в справочнике «Штатное расписание» или в кадровых документах (приказах, кадровых перемещениях) с текущей даты или с даты, с которой хотите применять изменения.
— Не меняйте задним числом документы, которые уже проведены и влияют на расчёты прошлых месяцев.
— Для индексации: создайте новый документ индексации с правильными параметрами с текущей даты, не меняя уже проведённые документы.
— Если индексация была проведена неправильно в прошлом, но пересчёт не делаете, то в новых начислениях будет использоваться правильная ставка.
— Для корректного расчёта среднего заработка (отпуска, больничные) важно, чтобы в регистрах начислений были корректные данные за периоды, используемые для расчёта среднего. Если данные за прошлые месяцы не меняются, то средний заработок будет рассчитываться на основе старых данных.
— Если хотите, чтобы средний заработок учитывал исправления, нужно либо делать перерасчёт, либо вручную корректировать данные среднего заработка в документах отпусков и больничных (вкладка «Ввод данных для расчёта среднего»).2. Учет новых должностей с учетом предыдущих
— В 1С должности сотрудников учитываются через кадровые документы (приказы о приеме, переводах, увольнении).
— Если вы введёте новые должности и оформите кадровые перемещения с правильными датами, то в расчетах зарплаты и среднего заработка будет учитываться история должностей.
— Для правильного расчёта среднего заработка и начислений важно, чтобы кадровые перемещения были оформлены корректно и своевременно.
— Если должности менялись, а документы не оформлялись или оформлялись с ошибками, то расчёты могут быть некорректными.
— При вводе новых должностей с правильными датами программа будет учитывать их с момента изменения, а в прошлых периодах останутся старые данные.3. Рекомендации
— Не меняйте документы прошлых периодов без крайней необходимости, чтобы не нарушить учёт.
— Для исправления ошибок в индексации и штатном расписании лучше делать корректирующие документы с текущей даты.
— Если нужно исправить средний заработок за прошлые периоды, можно вручную корректировать данные в документах отпусков и больничных.
— Проверьте корректность кадровых документов по должностям, при необходимости оформите кадровые перемещения.
— При необходимости сделайте перерасчёт зарплаты за текущие и будущие периоды с учётом исправлений.—
В итоге: 1С будет правильно считать оплату по среднему заработку, если данные начислений и кадровые документы корректны с текущего момента. История должностей учитывается, если кадровые перемещения оформлены правильно. Исправления прошлых периодов без пересчёта влияют только на новые начисления и расчёты.
Рекомендую посмотреть:
https://infostart.ru/public/659667/ — исправление среднего заработка после переноса и корректировок
https://infostart.ru/1c/articles/122955/ — что делать после переноса и исправления кадровых данных30 апреля 2026 в 11:31 в ответ на: Как настроить графики работы 18/2, 8/6 для МКУ с учётом смен и переработок? #36894Для казенного учреждения с такими режимами работы (спасатели и ЭДДС — посменно 18/2 и 8/6, администрация — пятидневка 8 часов) настройка в 1С:ЗУП 8.3 должна учитывать особенности сменного графика и переработок.
—
### 1. Настройка графиков работы
#### Для спасателей и ЭДДС (смены 18/2 и 8/6)
— В справочнике Графики работы создайте два отдельных графика для каждой смены:
— График 18/2
— Способ заполнения: «По циклам произвольной длины»
— Цикл: 20 дней (18 рабочих + 2 выходных)
— В табличной части укажите по дням цикла: 18 дней по 24 часа (или по фактической продолжительности смены, например, 18 часов работы + 6 часов отдыха, если так), 2 дня — выходные (0 часов).
— Виды времени: «Явка» (рабочее время), «Выходной» (0 часов).— График 8/6
— Аналогично, цикл 14 дней (8 рабочих + 6 выходных)
— В табличной части 8 дней с рабочими часами (например, 24 часа или фактическая смена), 6 дней — выходные.— Если смены не круглосуточные, а, например, 18 часов работы и 6 часов отдыха, то в графике указывайте именно часы явки (например, 18 часов), а не 24.
— Для удобства можно добавить виды времени для ночных часов, если есть доплаты.
#### Для администрации (пятидневка)
— Используйте стандартный график «Пятидневка» с 8 часами работы в день, 5 дней в неделю.
—
### 2. Назначение графиков сотрудникам
— В карточках сотрудников укажите соответствующий график работы (18/2, 8/6 или пятидневка).
— Для сотрудников, работающих по сменам, назначьте соответствующий график.
—
### 3. Настройка переработок
— В настройках расчета зарплаты включите суммированный учет рабочего времени для сменных графиков.
— В параметрах графика работы для сменных графиков установите флажок «Суммированный учет рабочего времени».
— В настройках переработок укажите, что норма рабочего времени определяется по производственному календарю или по графику (лучше по графику).
— Для переработок учитывайте, что при сменном графике норма считается за учетный период (месяц или квартал), а переработки — это часы сверх нормы.
— Если есть ночные часы, настройте отдельный вид времени и доплату.
—
### 4. Особенности учета
— Для смен 18/2 и 8/6 норма часов за месяц считается исходя из цикла графика (например, 18/2 — 18 часов работы * количество смен в месяце).
— В 1С ЗУП при суммированном учете программа сама подсчитывает норму и переработки за период.
— Если есть необходимость учитывать отдых внутри смены (например, 18 часов работы + 6 часов отдыха), то в графике можно разбить день на виды времени (явка и отдых).
—
### 5. Практические рекомендации
— Создайте графики с учетом реального времени смен (не обязательно 24 часа, если смена короче).
— Проверьте корректность заполнения графиков на несколько месяцев вперед.
— Настройте виды времени для ночных и вечерних часов, если есть доплаты.
— Включите суммированный учет рабочего времени в настройках расчета зарплаты.
— При необходимости используйте документы «Регистрация переработок» для фиксации сверхурочных.
—
### Итог
| График | Цикл (дней) | Рабочие дни | Выходные дни | Продолжительность смены | Особенности |
|———|————-|————-|—————|————————|————-|
| 18/2 | 20 | 18 | 2 | 18 часов (или по факту) | Суммированный учет, ночные часы |
| 8/6 | 14 | 8 | 6 | 8 часов (или по факту) | Суммированный учет, ночные часы |
| Пятидневка | 7 | 5 | 2 | 8 часов | Стандартный график |—
Рекомендую посмотреть подробное руководство по сменным графикам и переработкам в 1С:ЗУП:
https://infostart.ru/public/157746/
https://infostart.ru/1c/articles/1443431/ (пример с нерабочими днями и сменами)
https://infostart.ru/1c/articles/2185531/ (расширенные настройки графиков)30 апреля 2026 в 11:23 в ответ на: Как выгоднее перейти на 1С:Фреш для мобильной работы 8+ сотрудников? #36892Если сейчас у вас стационарная база 1С на 5 пользователей и 1С:ЗУП 8.3 Фреш, а планируется работать на 8 человек с мобильным приложением 1С:Мобильный, то вот что важно учесть:
1. Перевод всех пользователей на 1С:Фреш
— 1С:Фреш — облачный сервис, где лицензии приобретаются по подписке, оплата за пользователей и функционал.
— Для 8 пользователей нужно купить подписку на 8 рабочих мест.
— Включает автоматические обновления, резервное копирование, доступ из любой точки, мобильный клиент уже входит в состав.
— Упрощает администрирование, не нужно покупать и обслуживать сервер, СУБД.
— Перенос данных из стационарной базы в облако возможен, но требует подготовки и тестирования (особенно если база сильно кастомизирована).
— Для ЗУП 8.3 Фреш — это уже облачная версия, значит интеграция с мобильным приложением проще.2. Оставить стационарную базу и докупить лицензии
— Можно докупить лицензии на 8 пользователей для локальной базы (либо перейти на клиент-серверный режим, если сейчас файловый).
— Для мобильного приложения 1С:Мобильный нужно отдельно приобретать лицензии и настраивать обмен с локальной базой.
— Требуется собственный сервер или мощный ПК, администрирование, обновления и резервное копирование — на вашей стороне.
— Мобильный клиент требует настройки обмена, возможны сложности с синхронизацией.3. Что выгоднее?
— Если у вас нет мощного ИТ-отдела и хочется снизить затраты на поддержку, лучше перейти на 1С:Фреш — там все обновления и инфраструктура в облаке.
— Если база сильно кастомизирована, есть интеграции, и вы готовы вкладываться в поддержку — можно оставить локальную базу.
— Для мобильного приложения проще и дешевле работать с 1С:Фреш, т.к. мобильный клиент уже встроен и обмен настроен.4. Сложности переноса
— Перенос данных из локальной базы в 1С:Фреш возможен через выгрузку/загрузку или с помощью сервисов миграции.
— Если конфигурация стандартная или близка к стандарту — перенос пройдет проще.
— Если есть доработки, нестандартные обработки — потребуется адаптация и тестирование.
— Важно проверить версии платформы и конфигурации, чтобы они совпадали с облачными.5. Рекомендации
— Проведите аудит текущей базы: насколько она кастомизирована, есть ли интеграции.
— Свяжитесь с партнером 1С для оценки стоимости перехода и поддержки.
— Если хотите быстро и с минимальными затратами — переходите на 1С:Фреш.
— Для мобильного сбора данных и работы вне офиса 1С:Фреш удобнее и дешевле.—
Кратко: для 8 пользователей и мобильного приложения выгоднее перейти на 1С:Фреш, где мобильный клиент уже включен, нет затрат на сервер и администрирование. Перенос данных возможен, но требует подготовки. Если база сильно доработана — переход сложнее, но все равно реализуем.
Рекомендую почитать:
https://infostart.ru/public/1539933/ — сравнение локальной и облачной 1С
https://infostart.ru/public/2135324/ — особенности работы с 1С:Фреш и мобильным клиентом -
АвторСообщения