Разберем, как изменялся (скорее дополнялся) синтаксис текстов запросов на простом примере: Проводится документ Расходная содержащая в табличной части Товары список продаваемых товаров и количество. При проведении такого документа необходимо обеспечить контроль отрицательных остатков хранящихся в регистре накопления остатков ОстаткиТоваров.
Структура конфигурации представлена на рисунке справа:
Сформируем запрос к табличной части документа и виртуальной таблице Остатки регистра накопления. Учтем возможные дубли строк в документе, для этого произведем группирование записей.
Естественно приведенный запрос абсолютно не оптимален. С помощью вложенных запросов оптимизируем его: Произведем группирование табличной части документа до соединения с таблицей остатков, в параметры виртуальной таблицы передадим список товаров как значение условия для расчета остатков. В итоге наш запрос примет следующий вид:
Если бы в запросе необходимо было бы получить данные из остатков разных регистров то значение фильтра, а следовательно и наш второй вложенный запрос, повторялся бы во всех параметрах виртуальных таблиц, естественно что система при каждом вложенном запросе заново обращается к базе данных для получения данных.
Не помню уже с какого релиза в запросах стало можно использовать временные таблицы. Для этого используется объект «Менеджер временных таблиц». Фактически менеджер временных таблиц описывает пространство имен временных таблиц и отвечает за их создание и уничтожение в базе данных.
Сами временные таблицы действительно физически создаются в базе, соответственно следует относиться к ним осторожно, так как дисковая подсистема на сегодняшний момент самая медленная часть техники, а скорость создания и уничтожения таблиц напрямую от нее зависит.
Перепишем запрос для использования временных таблиц. Во временные таблицы поместим сгруппированную табличную часть документа и список товаров для фильтра виртуальных таблиц:
При использовании временных таблиц в тексте запроса применяют инструкцию Поместить для создания новой временной таблицы, в этом случае в результат запроса система передает не содержимое этой таблицы (см прим 1 и прим 2 в тексте выше), а количество записей помещенных во временную таблицу, по желанию можно не принимать это значение.
Также допускается использование инструкции Уничтожить в этом случае временная таблица уничтожается, в противном случае временные таблицы уничтожаются вместе с объектом менеджер временных таблиц.
В основном нашем запросе я использовал названия временных таблиц как указание на источник получения данных (им обязательно надо назначать синоним, что мы и видим в тексте). Использовать временные таблицы как источник можно не единожды, что при умелом их применении позволит и сократить текст запроса (улучшиться читабельность сложных запросов) и увеличить скорость (при использовании данных временной таблицы в нескольких местах запроса).
Пакетные запросы логично дополняют функционал временных таблиц и дают больше возможностей при работе с запросами.
В пакетном запросе фактически можно описать несколько запросов, как связанных между собой использованием временных таблиц, так и не связанных (можно, но не понятно зачем?). В итоге можно выполнить последовательно все запросы и принять в результате либо массив с результатами исполнения каждого запроса, либо результат последнего. Для получения массива с результатами запроса применяют метод ВыполнитьПакет() объекта запрос, а для получения результата последнего запроса ВыполнитьЗапрос().
В тексте запроса, запросы пакета разделяются символом «;» (точка с запятой). Область имен виртуальных таблиц у одного пакетного запроса одна. Использование менеджера временных таблиц не требуется, но возможно если вы хотите передать временные таблицы из одного пакетного запроса в другой.
Перепишем процедуру для использования пакетных запросов:
Фактически я убрал определение объекта запрос и использование менеджера временных таблиц, объединил тексты запросов (обратите внимание на разделитель «;» между текстами). В результате текст запроса стал читабельнее (а при использовании конструктора запросов намного увеличивается удобство чтения запроса).
После выполнения запроса в переменную МассивРезультатов у нас попадет 3 элемента. Первые два будут содержать число характеризующее количество записей помещенных во временные таблицы ДокТЧ и СписокТоваров, а третий будет содержать выборку с полями Номенклатура, Док_Количество и Рег_Количество.
В переменную РезультатЗапроса попадет только выборка.
Ну вот и все что касается пакетных запросов. Очень удобный механизм и с точки зрения написания запросов и с точки зрения чтения сложных запросов.
Автор: Павел Чистов
Решение проблем с печатью 1C терминально:
Собственно решение данной проблемы простое, не выбран принтер по умолчанию, или выбран принтер по умолчанию который отключен, нужно зайти в СИСТЕМУ и там выбрать принтер и тогда все ОК.
Еще возможная проблема - слишком длинное имя принтера - сделайте до 8 символов.
В некоторых релизах конфигураций на управляемом приложении на платформе 1С: Предприятие 8.3 можно получить следующую ошибку:
Текст по кнопочке “Подробно”:
Параметры Отбора, Сортировки, Группировки или список отображаемых полей заданы неверно. по причине: Невозможно применить фиксированные настройки. Пересекаются элементы отбора.
Воспроизведение ошибки
Ошибка появляется если в какой либо форме списка или выборка указать отбор, а после форму закрыть. При следующем открытии формы получим сообщение об ошибке.
Причина
Причина в использовании новой технологии в еще не подготовленной конфигурации, а именно свойство динамического списка “АвтоматическоеСохранениеПользовательскихНастроек”.
Два варианта решения данной проблемы:
1. Необходимо очистить сохраненные настройки пользователя. Пример для УТ 11.1: Переходим в меню “Администрирование – Настройки пользователей и прав – Очистка настроек” в появившейся форме выбираем пользователя(ей) и чистим. Такой вариант даст разовый результат, если пользователь снова поставит отбор, то получим такую же ошибку.
2. В форме списка или выбора элемента необходимо зайти в свойства динамического списка и свойству “АвтоматическоеСохранениеПользовательскихНастроек” установить значение “Ложь”.
Такой вариант решения можно считать временным, до момента обновления на релиз конфигурации с исправленной ошибкой.
Другой вариант получения текста файла (Функция очищает текст в формате HTML от тегов и возвращает неформатированный текст) - это использовать ФорматированныйДокумент:
Работая с html данными, бывает необходимо получить только чистый текст, исключив все теги и скрипты.
Ниже приведена универсальная функция, оставляющая только текст:
Многие спрашивают: Как вывести структуру на печать?
Путем простого перебора и вывода в табличный документ, вот пример:
Табличный документ
В основном, проблема в параметрах подключения - неверно указана версия платформы 1С.
Например, ваша конфигурация разработана для платформы 1С 8.3, а в настройках подключения прописано 1С 8.2 или наоборот.
Жизненный опыт решения проблемы "несовместимая версия файла базы данных 1cv8.1cd".
В первую очередь, единый совет для всех. Перед выполнением Всех манипуляций с файлом БД, всегда делайте архивную копию базы. Следуйте данному несложному правилу, и Вы избавитесь от почти всех малоприятных неожиданностей.
И так, при открытии базы, появляется сообщение следующего вида: "Ошибка при выполнении операции с базой данных
Несовместимая версия файла базы данных 'D:\путь к файлу/1Cv8.1CD' по причине:
Несовместимая версия файла базы данных 'D:\путь к файлу/1Cv8.1CD'"
Скажу сходу, что утилита chdbfl.exe здесь не может помочь, Вы станете получать ошибку "Произошло неожиданное прерывание выполнения проверки или исправления файла БД. Несовместимая версия файла базы данных 'D:\путь к файлу/1Cv8.1CD'"
Покопавшись чуть-чуть в гугле, я обнаружил причину данной проблемы (кстати, причина обычная) & не был схожим файл базы и версия платформы. Т.е. я открывал файл базы, сделанный в 8.2, платформой 8.3.
Для решения данной проблемы выполните следующие манипуляции: откройте базу конфигуратором; дальше, конфигуратор обязан конвертировать Вашу базу под ту версию платформы, на которой Вы на этот момент работаете.
А если, по каким-то причинам это не поможет - Вам понадобиться поставить ту версию платформы, в какой был вначале создан файл БД.
Иногда, при попутке открыть программу 1С, вылетает сообщение: "Выполняется ожидание возможности запуска..." При нажатии на клавишу "Выполнить запуск" никаких изменений не происходит и эта табличка висит на экране и идет отсчет времени. И так по кругу до бесконечности.
Такая проблема возникает редко, суть ее пока определить не удалось
Решение: Перезапустить службу сервера агента 1С или перезапуск всего сервера / компьютера с программой 1С
При попытке входа пользователя в базу появляется сообщение: "Ожидание запуска информационной базы. Установка соединения с информационной базой запрещена. Администратор просит вас самостоятельно завершить работу системы, в связи с необходимостью обновления конфигурации. Выполняется ожидание возможности запуска..." При нажатии на клавишу "Выполнить запуск" никаких изменений не происходит и эта табличка висит на экране и идет отсчет времени. Что делать?
В данном случае, похоже, процесс автоматического обновления конфигурации был случайно или преднамеренно прерван пользователем. Для решения проблемы нужно снять блокировку, и повторить обновление (обновление лучше проводить откатившись к резервной копии базы данных, сделанной до обновления).
Действия по решению проблемы зависят от варианты режима работы:
1) Файл-серверный режим работы базы. Для того, чтобы снять блокировку - удалите файл 1Cv8.cdn, который лежит в каталоге ИБ. После снятия блокировки, повторите попытку обновления.
2) Клиент-серверный режим. Снимите блокировку в консоли серверов в свойствах ИБ. После снятия блокировки, повторите попытку обновления.
Допустим, есть внешняя обработка, написанная для версии 8.1. Можно ли запустить ее в версии 8.2 так, чтобы работать с ее старой, неуправляемой формой? Обработка нужна всего один раз, для переноса данных, и создавать для нее управляемую форму ради одного раза не хочется...
Для внешних обработок (открываемых из отдельного файла) в управляемом режиме использование обычных форм не поддерживается. Поэтому если в конфигурации, работающей в управляемом режиме, необходимо запустить обработку с неуправляемой формой, и не хочется создавать для этой обработки новую, управляемую форму, то сначала такую обработку нужно включить в состав конфигурации.
Обычные (неуправляемые) формы могут работать только в толстом клиенте. Тонкий и веб-клиенты поддерживают работу только с управляемыми формами.
Поэтому, если нужно открыть обычную форму обработки в управляемом интерфейсе приложения, то это возможно только в толстом клиенте, запущенном в режиме управляемого приложения.
Проще всего запустить толстого клиента в режиме управляемого приложения из конфигуратора, указав это в параметрах: Сервис - Параметры - Запуск 1С:Предприятия - Основные - Толстый клиент (управляемое приложение).
При этом нужно помнить, что запуск клиентов в управляемом режиме возможен только в том случае, если у конфигурации отключена совместимость в версией 8.1 (свойство РежимСовместимости).
Однако этого недостаточно для того, чтобы платформа откорыла старую, неуправляемую форму обработки.
Возможность использования обычных форм в управляемом режиме регулируется специальным свойством конфигурации - ИспользоватьОбычныеФормыВУправляемомПриложении. Это свойство нужно установить.
В палитре свойств конфигурации это свойство отображается не всегда, а только в случае, если в параметрах конфигуратора выбран режим редактирования конфигурации Управляемое приложение и обычное приложение (Сервис - Параметры - Общие).
Ну и наконец, у объекта, обычную форму которого вы хотите увидеть в управляемом режиме, должна существовать единственная основная форма объекта, и эта форма должна быть обычной, неуправляемой.
В других случаях (если у объекта нет ни одной основной формы или у объекта есть управляемая основная форма) платформой будет по умолчанию генерироваться или открываться (если она есть) управляемая форма.
Новый пользователь пытается открыть программу и получает ошибку ошибка: «Нет права на запуск требуемого вида клиента».
Откройте Конфигуратор - Администрирование - Пользователи:
1. Если Пользователей нет, то создайте пользователя, введите имя, пароль и на закладке прочее установите Полные права
2. Если пользователи есть, то отройте проблемного пользователя и на закладке Прочее установите галки напротив нужных прав:
И отметьте галками права на запуск толстого и тонкого клиента:
Если у вас нет в списке Запуск толстого клиента или Запуск тонкого клиента, то нужно через конфигурацию открыть назначенную роль пользователю:
В окне редактирования роли отметить галками требуемые клиенты
Сохранить конфигурацию и все запустится
При разработке частенько нужно проверить наличие реквизита в документе или справочнике.
Ниже приведены функции позволяющие проверить наличие заданных реквизитов в объектах конфигурации:
Для документа:
P.S. Посмотрите еще Полезные функции по работе с метаданными
При попытке удалить запись из регистра сведений - получаю ошибку: она заблокирована, ошибка блокировок и т.д.
Отключил всех пользователей, перезапустил сервер, пробую удалить - опять ошибка блокировки
Путем тестов было вяснено, что проблема не в коде, а происходит это на этапе обращения платформы к SQL серверу... после долгих поисков решений, в интернете была найдена статья, которая помогла в решении данной проблемы:
Кто что блокирует, MS SQL + 1C
В повседневной работе достаточно задействовать только первый блок "/*кто кого*/". Открываем MS SQL Server Management Studio, правой на корень - "new query" - вставляем код запроса (только верхнюю часть до "Кто что блокирует", остальное - для детального анализа), выполняем запрос (вверху есть кнопочка выполнения запроса).
Выполнив запрос, запоминаем "ID виновника", быстренько идем в консоль сервера 1С, заходим в ветку "Сеансы" нашей базы. Видим все соединения с 1С-сервером, ищем там колонку "Соединение с СУБД", чтобы увидеть соединения 1С-сервера с MSSQL-сервером. В колонке будет всего несколько заполненных значений, среди них и будет "ID виновника".
Что делать если его там нет, тут 3 варианта:
1. Вернитесь в MSSQL и сделайте запрос еще несколько раз подряд, если значения меняются или таблица вообще пуста - постоянной блокировки нет, у вас (уже) все в порядке.
2. Сеанс который блокирует MSSQL находится в другой базе т.е. блокировка не в той базе (можно попробовать задействовать ветку всех сеансов в консоли 1С-сервера) - вернитесь в MSSQL и внимательно посмотрите в колонку DB в ней находится название базы.
3. Бывает что ID процесса в 1С-консоли вообще отсутствует, такое тоже бывает если у вас есть какие-то внешние программы подключенные напрямую в базу 1С, если пускаете кого-то в MSSQL напрямую, то вариант не исключен.
Код SQL-запроса:
В универсальном отчете понадобилось отключить вывод итого по некоторым полям, но в универсальном отчете, созданном через построитель, к сожалению это невозможно
Многие скажут - что давно пора использовать СКД и там все есть! - согласен на все 100% но есть клиенты у которых стоит программа УТ с 2012 года, их все устраивает и ничего не хотят менять, кроме отчетов. Вот один мой знакомы попросил отключить итоги в универсальном отчете - сделал это добавив следующий код в процедуру формирования отчета:
Для наглядности покажу на примере:
в выделенных полях добавленным кодом были стерты итоги
Необходимо запретить редактирование строк табличного поля документа добавленных ранее.
Пример: Пользователи ежедневно добавляют в документ строки с данными, нужно чтобы позже они не могли изменять уже введенные данные.
Для реализации этого, необходимо в ранее добавленных ячейках установить ТолькоПросмотр=Истина
Пример табличного поля:
При добавлении новой строки нужно заполнить дату добавления и имя пользователя!
Добавлена строка может быть или кнопкой INS (добавление) или кнопкой F9 (дублирование).
При добавлении последовательность событий такая:
* ПередНачаломДобавления - строка еще не доступна
При дублировании последовательность событий такая:
* ПередНачаломДобавления - строка еще не доступна
* ПриАктивизацииЯчейки - строка уже доступна, но строка пустая.
* Повторная ПриАктивизацииЯчейки - строка уже заполнена.
Как быть?
Для решения данной задачи необходимо использовать ПриНачалеРедактирования:
В реалии это выглядит так, нажали добавить и получили: