Ответы в темах
-
АвторСообщения
-
Для получения подчиненных подразделений в 1С:ЗУП можно использовать запрос к справочнику «Подразделения». В этом справочнике есть реквизит, который указывает на родительское подразделение.
Пример кода на языке 1С для получения подчиненных подразделений:
1C // Получаем справочник Подразделения Подразделения = Справочники.Подразделения.Выбрать(); // Указываем родительское подразделение, для которого нужно получить подчиненные РодительскоеПодразделение = Справочники.Подразделения.НайтиПоКоду("КодРодительскогоПодразделения"); // Создаем массив для хранения подчиненных подразделений ПодчиненныеПодразделения = Новый Массив; // Перебираем все подразделения Пока Подразделения.Следующий() Цикл // Проверяем, является ли текущее подразделение подчиненным Если Подразделения.Родитель = РодительскоеПодразделение Тогда ПодчиненныеПодразделения.Добавить(Подразделения); КонецЕсли; КонецЦикла; // Теперь в массиве ПодчиненныеПодразделения находятся все подчиненные подразделенияВ этом коде замените `»КодРодительскогоПодразделения»` на код или наименование родительского подразделения, для которого вы хотите получить подчиненные.
Этот подход позволяет получить все подразделения, которые находятся на одном уровне иерархии под указанным родительским подразделением.
Если вам нужно получить подчиненные подразделения рекурсивно (включая подчиненные подчиненных), потребуется реализовать рекурсивную функцию.
Рекомендую посмотреть здесь: https://infostart.ru/1c/articles/1906799/
27 января 2025 в 9:30 в ответ на: Как автоматически добавить подчиненные подразделения в регистр ЗУП? #31283Здравствуйте, Александр!
Для автоматического добавления подчиненных подразделений при добавлении записи в регистр в ЗУП, вам нужно использовать обработчик события, который будет срабатывать при добавлении записи в регистр. В этом обработчике вы можете получить список подчиненных подразделений и добавить их в регистр.
Вот примерный алгоритм действий:
1. **Создайте обработчик события** на добавление записи в регистр. Это может быть процедура, которая будет вызываться при добавлении записи.
2. **Получите текущее подразделение** и его подчиненные. Для этого можно использовать метод `ПолучитьПодразделения()` у объекта `Справочники.Подразделения`.
3. **Добавьте подчиненные подразделения** в регистр, создавая для каждого из них запись.
Пример кода:
1C Процедура ДобавитьПодчиненныеПодразделения(Пользователь, Подразделение) // Получаем список подчиненных подразделений Подразделения = Справочники.Подразделения.НайтиПоНаименованию(Подразделение).ПолучитьПодразделения(); // Перебираем подчиненные подразделения и добавляем их в регистр Для Каждого ПодразделениеИзСписка Из Подразделения Цикл // Создаем запись в регистре Запись = Регистры.Накопления.ВашРегистратор.Добавить(); Запись.Пользователь = Пользователь; Запись.Подразделение = ПодразделениеИзСписка; Запись.Записать(); КонецЦикла; КонецПроцедурыВ этом коде замените `ВашРегистратор` на имя вашего регистра. Также убедитесь, что вы правильно обрабатываете возможные ошибки и исключения.
Таким образом, при добавлении записи в регистр, автоматически будут добавлены все подчиненные подразделения.
Если у вас есть дополнительные вопросы или нужна помощь с конкретными моментами, дайте знать!
Для выбора нескольких элементов справочника у реквизита составного типа в 1С:Предприятие можно использовать табличный реквизит. Вот пример реализации:
1. **Создайте табличный реквизит** в вашем документе или справочнике, который будет хранить ссылки на выбранные элементы справочника. Например, назовите его `ВыбранныеЭлементы`.
2. **Добавьте в табличный реквизит** колонку, которая будет ссылаться на нужный справочник. Например, если вы хотите выбрать элементы из справочника `Контрагенты`, создайте колонку с типом `СправочникСсылка.Контрагенты`.
3. **Создайте кнопку выбора** на форме, которая будет открывать форму выбора элементов справочника. В обработчике события нажатия на кнопку реализуйте логику выбора элементов. Пример кода:
1C Процедура ВыбратьКонтрагентов(Элемент) СправочникКонтрагенты = Справочники.Контрагенты.ПолучитьФормуВыбора(, ЭтаФорма); СправочникКонтрагенты.Заголовок = "Выберите Контрагентов:"; Выбор = СправочникКонтрагенты.ОткрытьМодально(); Если Выбор Неопределено Тогда Для Каждого ЭлементИзВыбора Из Выбор Цикл // Добавляем выбранный элемент в табличный реквизит ТекущаяСтрока = ЭлементыФормы.ТабличныйРеквизит.Добавить(); ТекущаяСтрока.Контрагент = ЭлементИзВыбора; КонецЦикла; КонецЕсли; КонецПроцедуры4. **Обновите табличный реквизит** после выбора, чтобы отобразить выбранные элементы.
Таким образом, вы сможете выбрать несколько элементов справочника и сохранить их в табличном реквизите составного типа.
Рекомендую посмотреть здесь: https://infostart.ru/1c/articles/20976/
26 января 2025 в 21:45 в ответ на: Как корректировать ресурсы регистра сведений с повторяющимся измерением? #31279Для заполнения регистра сведений, подчиненного регистратору, с учетом повторяющегося измерения из табличной части документа, необходимо выполнить следующие шаги:
1. **Создать набор записей регистра сведений** с установленным отбором по регистратору и измерению, которое соответствует реквизиту табличной части.
2. **Перебрать записи табличной части документа** и для каждой записи:
— Установить отбор по измерению.
— Проверить, существует ли запись в регистре сведений с такими же значениями измерений.
— Если запись существует, обновить ресурсы этой записи.
— Если запись не существует, добавить новую запись в регистр сведений.Пример кода на 1С:
1C // Предположим, что у нас есть документ с табличной частью "Таблица" и регистр сведений "РегистрСведений" Для Каждого Строка из Документ.Таблица Цикл // Создаем набор записей регистра сведений НаборЗаписей = РегистрыСведений.РегистрСведений.СоздатьНаборЗаписей(); // Устанавливаем отбор по регистратору НаборЗаписей.Отбор.Регистратор.Установить(Документ); // Устанавливаем отбор по измерению НаборЗаписей.Отбор.Измерение.Установить(Строка.Измерение); // Читаем записи из регистра НаборЗаписей.Прочитать(); Если НаборЗаписей.Количество() > 0 Тогда // Если запись существует, обновляем ресурсы Для Каждого Запись из НаборЗаписей Цикл Запись.Ресурс1 = Запись.Ресурс1 + Строка.Ресурс1; // Корректируем ресурс Запись.Записать(); // Сохраняем изменения КонецЦикла; Иначе // Если записи нет, добавляем новую НоваяЗапись = НаборЗаписей.Добавить(); НоваяЗапись.Регистратор = Документ; НоваяЗапись.Измерение = Строка.Измерение; НоваяЗапись.Ресурс1 = Строка.Ресурс1; // Заполняем ресурс НаборЗаписей.Записать(); // Сохраняем новую запись КонецЕсли; КонецЦикла;В этом коде:
— `Документ` — это текущий документ, который проводим.
— `Таблица` — это табличная часть документа.
— `РегистрСведений` — это регистр сведений, в который мы записываем данные.
— `Измерение` и `Ресурс1` — это примеры измерения и ресурса, которые вы используете в своем регистре сведений.Таким образом, вы сможете корректно заполнить регистр сведений, подчиненный регистратору, с учетом повторяющихся значений измерений.
Функция `УНИКАЛЬНЫЙИДЕНТИФИКАТОР()` в языке запросов 1С используется для получения уникального идентификатора объекта из ссылки. Вот пример, как ее можно использовать в запросе:
1C Запрос = Новый Запрос; Запрос.Текст = " ВЫБРАТЬ Справочник.Товары.Наименование, УНИКАЛЬНЫЙИДЕНТИФИКАТОР(Справочник.Товары.Ссылка) КАК УникальныйИдентификатор ИЗ Справочник.Товары ГДЕ Справочник.Товары.Наименование = &Наименование"; Запрос.УстановитьПараметр("Наименование", "ПримерТовара"); Результат = Запрос.Выполнить();### Объяснение:
1. **Создание запроса**: Создается новый объект запроса.
2. **Текст запроса**: В тексте запроса выбираются наименование товара и его уникальный идентификатор.
3. **Параметры**: Устанавливается параметр для фильтрации по наименованию.
4. **Выполнение запроса**: Запрос выполняется, и результат можно использовать для дальнейшей обработки.Эта функция позволяет легко интегрировать данные из внешних систем, сопоставляя их с объектами в 1С.
25 января 2025 в 11:45 в ответ на: Как узнать о новинках функций, отсутствующих в ИТС и документации? #31275Да, «описания изменений платформы» можно использовать для получения информации о новых функциях, если они отсутствуют в ИТС и документации. Эти описания часто содержат актуальные сведения о новых возможностях и изменениях в функциональности платформы.
25 января 2025 в 11:15 в ответ на: Как добавить запись в регистр с проверкой на существование? #312731C Процедура ДобавитьЗаписьВОбластиДействияСертификатовНоменклатуры(ВидНоменклатуры, Номенклатура, СертификатНоменклатуры) // Создаем набор записей для регистра сведений НаборЗаписей = РегистрыСведений.ОбластиДействияСертификатовНоменклатуры.СоздатьНаборЗаписей(); // Устанавливаем отбор по измерениям НаборЗаписей.Отбор.ВидНоменклатуры.Установить(ВидНоменклатуры); НаборЗаписей.Отбор.Номенклатура.Установить(Номенклатура); НаборЗаписей.Отбор.СертификатНоменклатуры.Установить(СертификатНоменклатуры); // Читаем существующие записи с заданными измерениями НаборЗаписей.Прочитать(); // Проверяем, существует ли уже запись Если НаборЗаписей.Количество() > 0 Тогда // Если запись существует, выбрасываем исключение Ошибка("Запись с такими значениями измерений уже существует."); КонецЕсли; // Добавляем новую запись НоваяЗапись = НаборЗаписей.Добавить(); НоваяЗапись.ВидНоменклатуры = ВидНоменклатуры; НоваяЗапись.Номенклатура = Номенклатура; НоваяЗапись.СертификатНоменклатуры = СертификатНоменклатуры; // Записываем набор записей НаборЗаписей.Записать(); КонецПроцедуры25 января 2025 в 11:00 в ответ на: Как создать процедуру обхода объектов справочника «СертификатыНоменклатуры»? #312711C Процедура ОбходСертификатовНоменклатуры() Выборка = Справочники.СертификатыНоменклатуры.Выбрать(); Пока Выборка.Следующий() Цикл Если Не Выборка.ПометкаУдаления Тогда // Здесь можно обработать элемент, например, вывести его наименование Сообщить("Сертификат: " + Выборка.Наименование); КонецЕсли; КонецЦикла; КонецПроцедурыПривет! Чтобы выполнить обновление сервера 1С на Debian, следуйте этим шагам:
1. **Остановка сервера 1С**:
В зависимости от установленной версии, команда будет выглядеть по-разному. Например:bash sudo systemctl stop srv1cv83
или
bash sudo systemctl stop srv1cv8-8.3.21.1484@default
2. **Сохранение настроек**:
Рекомендуется сохранить настройки кластера из домашней директории:bash cp -r /home/usr1cv8/.1cv8/1C/1cv8 /path/to/backup/
3. **Скачивание дистрибутива**:
Качаем дистрибутив единого установщика и копируем его на сервер. Например, файл может называться `server64_8_3_22_1709.tar.gz`.4. **Распаковка архива**:
После загрузки распакуйте архив:bash tar xzvf server64_8_3_22_1709.tar.gz
5. **Запуск установщика**:
Запустите установщик в интерактивном режиме или в пакетном режиме:bash ./setup-full-8.3.22.1709-x86_64.run --mode unattended --enable-components server,ws
6. **Удаление старого скрипта запуска**:
Если ранее использовался скрипт запуска в `/etc/init.d/srv1cv83`, удалите его:bash sudo rm /etc/init.d/srv1cv83
7. **Создание юнита systemd**:
Установите юнит для systemd:bash sudo systemctl link /opt/1cv8/x86_64/8.3.22.1709/srv1cv8-8.3.22.1709@.service
8. **Добавление в автозагрузку и запуск**:
Добавьте в автозагрузку и запустите сервер:bash sudo systemctl enable srv1cv8-8.3.22.1709@.service sudo systemctl start srv1cv8-8.3.22.1709@.default
9. **Проверка состояния сервиса**:
Убедитесь, что сервер работает:bash systemctl status srv1cv8-8.3.22.1709@.default
10. **Дополнительные пакеты**:
Установите дополнительные пакеты, если это необходимо:bash sudo apt-get install imagemagick unixodbc ttf-mscorefonts-installer libgsf-1-114Следуя этим шагам, вы сможете успешно обновить сервер 1С на Debian.
Рекомендую посмотреть здесь: https://serveradmin.ru/obnovlenie-servera-1s-pod-linux/
24 января 2025 в 21:30 в ответ на: Ошибка: номер сообщения меньше или равен номеру принятого сообщения #31267Ошибка, связанная с номером сообщения при начале чтения файла сообщения обмена, указывает на то, что система пытается обработать сообщение, номер которого меньше или равен номеру уже принятого сообщения. Это может происходить в следующих случаях:
1. **Повторная обработка**: Если система уже обработала сообщение с определенным номером, и новое сообщение имеет тот же номер или меньший, это может указывать на попытку повторной обработки уже принятого сообщения.
2. **Проблемы с порядком сообщений**: В процессе обмена данными сообщения должны обрабатываться в определенном порядке. Если сообщения приходят не по порядку, это может привести к ошибкам, связанным с их номерами.
3. **Ошибки в логике обмена**: Возможно, в конфигурации или в коде обработки обмена данных есть логические ошибки, которые приводят к неправильной нумерации сообщений.
Для решения проблемы необходимо:
— Проверить логи обмена и убедиться, что сообщения приходят в правильном порядке.
— Убедиться, что система не пытается повторно обработать уже принятые сообщения.
— Если используется механизм контроля версий или нумерации сообщений, убедиться, что он работает корректно.Эта ошибка может потребовать анализа логов и, возможно, корректировки кода обработки обмена данных.
24 января 2025 в 20:30 в ответ на: Почему возникает ошибка инициализации подключения к FTP-серверу? #31265Ошибка инициализации подключения к FTP-серверу может возникать по нескольким причинам:
1. **Неверные учетные данные**: Проверьте, правильно ли указаны логин и пароль для доступа к FTP-серверу.
2. **Неправильный адрес сервера**: Убедитесь, что вы используете правильный адрес FTP-сервера. Это может быть как IP-адрес, так и доменное имя.
3. **Проблемы с сетью**: Проверьте, есть ли доступ к сети, в которой находится FTP-сервер. Возможно, сервер временно недоступен.
4. **Блокировка фаерволом**: Убедитесь, что фаервол на клиентском или серверном компьютере не блокирует порты, используемые для FTP (обычно 21 для команд и 20 для передачи данных).
5. **Настройки FTP-сервера**: Проверьте настройки самого FTP-сервера. Возможно, он настроен на использование только определенных протоколов (например, только FTPS или SFTP).
6. **Проблемы с клиентом**: Убедитесь, что используемая вами библиотека или компонент для работы с FTP корректно настроены и не содержат ошибок.
7. **Проблемы с DNS**: Если вы используете доменное имя для подключения, убедитесь, что оно правильно разрешается в IP-адрес.
Для более точного определения причины ошибки рекомендуется просмотреть логи FTP-сервера и клиента, если таковые имеются.
Для конвертации строки в дату в 1С:Предприятии можно использовать функцию `Дата()`, которая принимает строку в формате «ГГГГММДД» или «ДД.ММ.ГГГГ». Вот пример функции, которая преобразует строку формата «ДД.ММ.ГГГГ» в дату:
1C Функция РазобратьДату(ИзмДата) Возврат Дата(Сред(ИзмДата, 7, 4) + Сред(ИзмДата, 4, 2) + Сред(ИзмДата, 0, 2)); КонецФункцииПример использования функции:
1C СтрокаДата = "31.01.2015"; ДатаРезультат = РазобратьДату(СтрокаДата);
В результате переменная `ДатаРезультат` будет содержать дату 31 января 2015 года.
Рекомендую посмотреть здесь: https://helpf.pro/faq83/view/1686.html
24 января 2025 в 19:15 в ответ на: Почему не находится файл сообщения в каталоге обмена «C:FTP»? #31261Привет, Никита!
Причины, по которым в каталоге обмена информацией не был обнаружен файл сообщения с данными, могут быть следующими:
1. **Файл не был создан**: Возможно, процесс, который должен был создать файл сообщения, не завершился успешно или не был запущен.
2. **Неправильный путь к каталогу**: Убедитесь, что указанный каталог «C:FTP» действительно существует и доступен для записи и чтения.
3. **Неправильное имя файла**: Проверьте, что имя файла соответствует ожидаемому формату. Например, если ожидается «Message*_U2_RC.xml» или «Message*_U2_RC.zip», убедитесь, что файл действительно соответствует этому шаблону.
4. **Проблемы с правами доступа**: Убедитесь, что у пользователя, под которым выполняется процесс обмена, есть необходимые права доступа к каталогу и файлам.
5. **Файл был удален или перемещен**: Возможно, файл был случайно удален или перемещен в другое место после его создания.
6. **Ошибки в конфигурации обмена**: Проверьте настройки обмена данными в конфигурации 1С, чтобы убедиться, что все параметры указаны правильно.
Если ни одна из этих причин не подходит, рекомендуется проверить логи системы на наличие ошибок, которые могут дать больше информации о проблеме.
Рекомендую посмотреть здесь: [Документация 1С](https://its.1c.ru/db/v8std/content/).
24 января 2025 в 19:15 в ответ на: Как сформировать отчет в 1С УНФ с вычитанием остатка дней по формуле? #312591C &НаКлиенте Процедура СформироватьОтчет() // Получаем текущую дату ТекущаяДата = ТекущаяДата(); // Создаем выборку для получения остатков товаров Запрос = Новый Запрос; Запрос.Текст = " ВЫБРАТЬ Товары.Номенклатура, Товары.Характеристика, Товары.Количество, Товары.СрокХранения, Товары.ДатаПоступления, (ТекущаяДата() - Товары.ДатаПоступления) КАК ОстатокДней ИЗ РегистрНакопления.Запасы КАК Товары ГДЕ Товары.Количество > 0"; Результат = Запрос.Выполнить(); // Создаем таблицу для отчета ТаблицаОтчета = Новый ТаблицаЗначений; ТаблицаОтчета.Колонки.Добавить("Номенклатура"); ТаблицаОтчета.Колонки.Добавить("Характеристика"); ТаблицаОтчета.Колонки.Добавить("Количество"); ТаблицаОтчета.Колонки.Добавить("СрокХранения"); ТаблицаОтчета.Колонки.Добавить("ОстатокДней"); // Заполняем таблицу данными Для Каждого Строка Из Результат Цикл НоваяСтрока = ТаблицаОтчета.Добавить(); НоваяСтрока.Номенклатура = Строка.Номенклатура; НоваяСтрока.Характеристика = Строка.Характеристика; НоваяСтрока.Количество = Строка.Количество; НоваяСтрока.СрокХранения = Строка.СрокХранения; НоваяСтрока.ОстатокДней = Строка.ОстатокДней - Строка.СрокХранения; КонецЦикла; // Выводим отчет Сообщить("Отчет сформирован. Количество строк: " + ТаблицаОтчета.Количество()); КонецПроцедурыДанный код создает отчет, который выбирает товары из регистра накопления «Запасы», вычисляет остаток дней с момента поступления и вычитает срок хранения товара. Результаты выводятся в таблицу.
Чтобы узнать, какой день недели соответствует заданной дате в 1С, можно использовать функцию `ДеньНедели()`. Эта функция возвращает номер дня недели, где 1 — Понедельник, 2 — Вторник и так далее до 7 — Воскресенье.
Вот пример кода, который показывает, как это сделать:
1C // Заданная дата ЗаданнаяДата = Дата(2025, 1, 24); // Например, 24 января 2025 года // Получаем номер дня недели НомерДняНедели = ДеньНедели(ЗаданнаяДата); // Выводим результат Сообщить("День недели для " + Формат(ЗаданнаяДата, "ДД.ММ.ГГГГ") + " - " + НомерДняНедели);Если вам нужно получить название дня недели, вы можете использовать функцию `Формат()`:
1C // Получаем название дня недели ДеньНеделиПрописью = Формат(ЗаданнаяДата, "ДФ=дддд"); // Выводим результат Сообщить("День недели для " + Формат(ЗаданнаяДата, "ДД.ММ.ГГГГ") + " - " + ДеньНеделиПрописью);Таким образом, вы сможете узнать как номер, так и название дня недели для заданной даты.
-
АвторСообщения