Привет. В платформе есть АВТОНОМЕРЗАПИСИ и неявная сортировка временных таблиц
ВЫБРАТЬ ПЕРВЫЕ 999999999999 ВнутреннийЗаказ.Сформировал КАК Сформировал, КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВнутреннийЗаказ.Ссылка) КАК КолВоДокументов, АВТОНОМЕРЗАПИСИ() КАК Рейтинг ПОМЕСТИТЬ ВрТабл ИЗ Документ.ВнутреннийЗаказ КАК ВнутреннийЗаказ ГДЕ ВнутреннийЗаказ.Дата >= &Дата И ВнутреннийЗаказ.Сформировал <> ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка)
СГРУППИРОВАТЬ ПО ВнутреннийЗаказ.Сформировал
УПОРЯДОЧИТЬ ПО КолВоДокументов УБЫВ ; Выбрать * Из ВрТабл
UPD: Не обратил внимание что должен выводиться одинаковый рейтинг для одинаковых количеств документов. В случае выше просто увеличивается номер согласно сортировки, но запрос оставил для истории, может кому пригодиться. Если по задаче, то можно сформировать отдельную таблицу рейтингов согласно количеству документов и уже с ней соединяться
ВЫБРАТЬ КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВнутреннийЗаказ.Ссылка) КАК КолВоДокументов, ВнутреннийЗаказ.Сформировал КАК Сформировал ПОМЕСТИТЬ ВрТабл ИЗ Документ.ВнутреннийЗаказ КАК ВнутреннийЗаказ ГДЕ ВнутреннийЗаказ.Дата >= &Дата И ВнутреннийЗаказ.Сформировал <> ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка)
СГРУППИРОВАТЬ ПО ВнутреннийЗаказ.Сформировал ;
//////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ПЕРВЫЕ 999999999 ВрТабл.КолВоДокументов КАК КолВоДокументов, АВТОНОМЕРЗАПИСИ() КАК Рейтинг ПОМЕСТИТЬ ВрРейтинг ИЗ ВрТабл КАК ВрТабл
СГРУППИРОВАТЬ ПО ВрТабл.КолВоДокументов
УПОРЯДОЧИТЬ ПО КолВоДокументов УБЫВ ;
//////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВрТабл.Сформировал КАК Сформировал, ВрТабл.КолВоДокументов КАК КолВоДокументов, ВрРейтинг.Рейтинг КАК Рейтинг ИЗ ВрТабл КАК ВрТабл ЛЕВОЕ СОЕДИНЕНИЕ ВрРейтинг КАК ВрРейтинг ПО ВрТабл.КолВоДокументов = ВрРейтинг.КолВоДокументов
Я не знаю на каких правах делаются локализации. Если кто знает, пишите. Могу предположить что всё заплачено ещё до того как какая-либо конфигурация вышла на рынок. Уходит что-либо с САБ на росию или нет СЕЙЧАС - это пусть наши органы изучают. Если уходит, то по всей строгости закона их разнести - как раз под это дело законы и вышли. Если весь безнал будет в Украине, то на росию деньги только в чемоданах возить смогут.
На сегодняшний день нет адекватной замене этому софту на рынке.
p.s. Сам то я сейчас учу другой язык и другую платформу для бизнес решений (европейскую).
andr_andrey @ Сегодня, 11:00
, На самом деле так и делается))) В самой транзакции проведения фиксируется сам факт необходимости формирования отложенных движений в отдельном регистре сведений. А затем стартует алгоритм формирования движений. Этот алгоритм уже обрабатывает эту очередь многопоточно N фоновыми заданиями. Сам алгоритм управления фоновыми достаточно сложный. Если в двух словах, то он должен уметь запускать определённое количество фоновых и так что бы наборы не пересекались чтоб не ловить блокировки. Огромная куча фоновых заданий так же положит систему. В общем как я и написал - это отдельная история)))
Если на входе таблица значений и на выходе тоже должна быть таблица значений и не принципиально использовать именно запрос, тогда можно и с помощью СКД сделать
// создаем схему СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных;
// Добавляем Источник данных. ИсточникДанных = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить(); ИсточникДанных.Имя = "ИсточникДанных"; ИсточникДанных.ТипИсточникаДанных = "Local";
// Добавляем наборы данных. // тз - это наша таблица значений с колонками ДатаОстатков и Договоры, используем в качестве внешнего набора данных НаборДанныхОбъектСхемыКомпоновкиДанных1 = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных")); НаборДанныхОбъектСхемыКомпоновкиДанных1.Имя = "НаборДанных1"; НаборДанныхОбъектСхемыКомпоновкиДанных1.ИмяОбъекта = "тз"; НаборДанныхОбъектСхемыКомпоновкиДанных1.ИсточникДанных = "ИсточникДанных";
// это запрос к нашему регистру для получения остатков на каждую дату таблицы первого набора НаборДанныхОбъектСхемыКомпоновкиДанных2 = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных")); НаборДанныхОбъектСхемыКомпоновкиДанных2.Имя = "НаборДанных2"; НаборДанныхОбъектСхемыКомпоновкиДанных2.ИсточникДанных = "ИсточникДанных"; НаборДанныхОбъектСхемыКомпоновкиДанных2.Запрос = "ВЫБРАТЬ | &ДатаОстатков КАК ДатаОстатков, | рнОстатки.Договор, | рнОстатки.Сумма КАК СуммаОстаток |ИЗ | РегистрНакопления.НашРегистрСОстаткамиПоДоговорам.Остатки(&ДатаОстатков, ) КАК рнОстатки"; НаборДанныхОбъектСхемыКомпоновкиДанных2.АвтоЗаполнениеДоступныхПолей = Истина;
Я Вас прекрасно понял. Для того что бы в запросе что-либо сгруппировать, необходимо иметь это поле по которому можно группировать
Вы привели пример на "кубиках", я и привел так же для примера запрос, в котором для "Група1" и "Група3" есть общее поле с наименованием "Група1+Група3" В "Група2" и "Група4" оно равно NULL. Далее в запросе проверяем что если заполнено объединяющее поле, то используем его для получения итогов. Если не заполнено, то используем поле Группа.
Возможно если бы Вы привели точный пример запроса, то и ответ получили бы более точный)
Официальных данных и информации нет об этом. Если коротко - все говорят что закончиться поддержка, чтоб продавать быстрее другое ПО.
Когда выйдет официально инфа об этом, то будет минимум год переходного периода. При этом обычный ИТС скорее всего не сможете купить. Сейчас это называется "ИТС ретро", который стоит на порядок выше. т.е. поддержку получать будете, но и платить соответственно будете больше. Но что САБ придумает по этому поводу на самом деле знает только САБ.
Попробуйте следующее: - включите ограничение доступа на уровне записей (должно быть в разделе администрирования/ настройка пользователей и прав) - настроить профили групп доступа (после включения пункта выше). Установить ограничение данных по складам. Возможно потребуется скопировать предопределенные группы - создать группы доступа на основании профилей и включить в них своих пользователей.
Полностью снимал режим совместимости на УПП пару лет назад, пользовался так же информацией с ИТСа, скорей всего той что скидывали выше.
1 лайфхак для мобильного клиента. Это создание параметра сеанса ЭтоМобильныйКлиент типа Булево. При инициализации параметров сеанса его устанавливаем и потом проверяем там где нужно. Связано это с тем что когда мы находимся на сервере, то нельзя определить мобильный это клиент или нет и для того что бы не заморачиваться с передачей параметров в процедуры/функции и используется параметр сеанса, который доступен на сервере. 2 лайфхак для мобильного клиента. Берем библиотеку подключаемого оборудования для мобильных приложений и выдергиваем из неё общий макет Драйвер1ССканерШтрихкода Добавляем его в нашу конфигурацию, например, Драйвер1ССканерШтрихкодаАндроид. Переопределяем процедуры инициализации драйвера оборудования если ЭтоМобильныйКлиент = Истина И тогда нормально заработает и сканер штрихкодов (делалось для ТСД на андроиде)
По проблеме топик стартера, по памяти тоже сталкивался с тем что перестали работать бух отчеты. Проблема была в том что там какие-то данные перестали сериализоваться (т.е. в старой платформе они серилизовались, а в новой уже нет). Я в отладчике нашел место и переписал передачу этих данных в виде строки с помощью: ЗначениеВСтрокуВнутр() ЗначениеИзСтрокиВнутр() и заработало
А ДнейБезЗаказа без заказа это случайно не реквизит с типом Дата? Или может проблема в ДатаПоследнейРеализации = Выборка.Дата; В результате запроса нет данных поэтому ДатаПоследнейРеализации это не дата, которую пытаетесь привести к началу дня
Упрощенно код который разбивает файл на куски выглядит так:
ИмяБезРасширения = ""; // Чистое имя используется для генерации новых файлов ИмяФайла = ""; // ИмяФайла - закачанный и разархивированный файл XML ПутьКНовымФайлам = ""; // путь куда будут сохраняться новые файлы
Если ЭтоLinuxСервер() ТОгда // отдельная функция которая распознает где крутится сервер 1С Слеш = "/"; Иначе Слеш = "\"; КонецЕсли;
// читаем файл, ЧтениеXML = Новый ЧтениеXML; ЧтениеXML.ОткрытьФайл(ИмяФайла); //Разделяем указанный файл на несколько частей заданного размера, по 100000 записей. НомерФайла = 0; КоличествоСтрокФайла = 0; КоличествоЗаписейДляПрерыванияАлгоритма = 100000;
ЗаписьXML = Неопределено; Пока ЧтениеXML.Прочитать() Цикл //Цикл по структуре ИмяЧтения = ЧтениеXML.Имя; ТипУзлаЧтения = ЧтениеXML.ТипУзла; Если ИмяЧтения = "DATA" Тогда // этот тег нам не нужен, пропускаем и переходим к записям Продолжить; КонецЕсли; Если ИмяЧтения = "RECORD" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда // увеличиваем счетчик обработанной записи для того что бы как только достигнет нужного числа мы запишем файл и начнем новый КоличествоСтрокФайла = КоличествоСтрокФайла + 1; КонецЕсли;
// инициируем запись нового файла Если КоличествоСтрокФайла = 1 И ЗаписьXML = Неопределено Тогда НомерФайла = НомерФайла + 1; ЗаписьXML = Новый ЗаписьXML; ИмяНовогоФайла = ПутьКНовымФайлам + Слеш + ИмяБезРасширения + "_"+ НомерФайла + ".xml"; ЗаписьXML.ОткрытьФайл(ИмяНовогоФайла, "UTF-8"); ЗаписьXML.ЗаписатьОбъявлениеXML(); // ЗаписьXML.ЗаписатьНачалоЭлемента("DATA"); // начинаем общий тег для хранения списка записей КонецЕсли;
// в упращенном файле используются только начало, конец элемента и текст Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда ЗаписьXML.ЗаписатьНачалоЭлемента(ИмяЧтения); ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда ЗаписьXML.ЗаписатьКонецЭлемента(); ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда ЗаписьXML.ЗаписатьТекст(ЧтениеXML.Значение); КонецЕсли;
// определяем что в новом файле уже нужное нам количество записей Если КоличествоСтрокФайла = КоличествоЗаписейДляПрерыванияАлгоритма И ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента И ИмяЧтения = "RECORD" Тогда ЗаписьXML.ЗаписатьКонецЭлемента(); // DATA ЗаписьXML.Закрыть(); // обнуляем значения для того чтоб попало в проверку генерации нового файла КоличествоСтрокФайла = 0; ЗаписьXML = Неопределено; КонецЕсли; КонецЦикла;
Если ЗаписьXML <> Неопределено Тогда // последний файл с вероятностью 99.99% не записан ЗаписьXML.ЗаписатьКонецЭлемента(); // DATA ЗаписьXML.Закрыть(); КоличествоСтрокФайла = 0; ЗаписьXML = Неопределено; КонецЕсли;
Вырезал куски, у меня просто там куча всего ещё написано для отладки и настройки алгоритмов загрузки. Но для понимания должно хватить)
Вы можете в функцию передать все ваши параметры плюс один дополнительный, например:
Функция ВычислитьСумму(Сумма1, Сумма2, Сумма3, Сумма4, МетодСуммирования) Экспорт
Если МетодСуммирования = 1 Тогда Результат = Сумма1 + Сумма2; ИначеЕсли МетодСуммирования = 2 Тогда Результат = Сумма3 + Сумма4; ИначеЕсли МетодСуммирования = 3 Тогда Результат = Сумма1 + Сумма2 + Сумма3 + Сумма4; Иначе Результат = 0; // ну и т.д. как душе угодно КонецЕсли; Возврат Результат;
Конецфункции;
Тогда код в выражениях будет почти всегда один и тот же для облегчения написания, а управлять расчетом будет отдельный параметр
В схеме компоновки данных есть возможность определения вычисляемого поля. Вычисляемые поля представляют собой дополнительные поля схемы, значения которых будут вычисляться по некоторой формуле. Вычисляемые поля можно создавать для того, чтобы использовать поля из различных наборов данных, выполнять операции над полями наборов данных - объект, и для других целей. В настройках компоновки данных вычисляемое поле будет фигурировать под именем, указанным в пути к данным этого поля. Пользователь сможет работать с вычисляемым полем точно так же, как и с полем набора данных.
Для того чтобы система смогла получить значение вычисляемого поля, необходимо указать выражение вычисляемого поля. Выражение вычисляемого поля описывается на языке выражений компоновки данных. В выражениях вычисляемого поля есть ограничение - в нем нельзя использовать вычисляемые поля. В остальном, ограничений нет - можно использовать все синтаксические конструкции языка выражений, можно использовать поля наборов данных, можно использовать функции общих модулей конфигурации.
Для вычисляемого поля можно определить заголовок, ограничение доступности, выражение представления, выражения упорядочивания, тип значения, доступные значения и оформление также как для полей наборов данных. Кроме того, вычисляемое поле может быть определено как ресурс, для этого необходимо добавить данное поле в список ресурсов и указать выражение, по которому будет вычисляться итог.
Р.S. Информация взята с сайта ИТС. Как вариант можно написать свою функцию общего модуля и передавать в неё значения в качестве параметров, а она пусть уже считает как Вам хочется.
Vond, Фишка в том что есть огромный файл. Его нужно читать последовательно, а не целиком. Алгоритм следующий: 1. Читаешь последовательно строки XML с помощью
ЧтениеXML = Новый ЧтениеXML; ЧтениеXML.ОткрытьФайл(ИмяФайла); ЧтениеXML.Прочитать(); // начинаем читать дальше строки файла
Пока ЧтениеXML.Прочитать() Цикл //Цикл по структуре // ......... КонецЦикла;
В этом случае оперативная память не загружается и в ней находятся только прочитанные на момент чтения строки. Минус в том что мы не можем контролировать что загружено из файла что нет и если что-то пойдет не так то нам нужно начинать сначала. 2. Поэтому перед тем как выполнять записи в базу я этот большой XML дробил программно на кучу (по 100000 записей, это на усмотрение) В результате у меня было N количество небольших файлов ожидающих загрузки данных. 3. После того как новые файлы сформированы запускаем уже разбор этих отдельных файлов. Читаю каждый файл и гружу по нему данные. Если успешно загрузился, то грохаю его, если прошла какая-то ошибка, то пропускаю (перемещаю в отдельный каталог. что бы потом выяснить на чем прошел затык) И так выполняется пока все они не будут обработаны.
Обработка для российских конфигураций. Лучше задавать вопросы по ней автору непосредственно на инфостарте. Опыта нет с этой обработкой. Из описания я понял что вроде как должна работать. С одним НО: без разработчика не обойтись - он должен настроить статьи и алгоритмы получения данных по статьям. Обработка всего-лишь инструмент, основным источником получения данных являются запросы, которые пишутся под каждую статью. Когда-то давно для УПП я делал нечто подобное что описано в обработке. Определялся список статей расходов и доходов и описывались источники получения данных для этих статей (правда у меня могли обходиться без программиста, нужен был просто продвинутый пользователь 1С)
А управленческий баланс дело очень интимное. У каждой организации он считается по разному и почему он не сходится - нужно разбираться непосредственно в базе.
Давайте без "допустим"? ТипЗнч возвращает тип переданного в неё значения (неожиданно, да?).
ТипЗнч("СправочникСсылка.Справочник1") - это строка, какую информацию Вы хотите получить от параметра типа "Строка"? Для того что бы получить всё что слева нужно использовать методы, которые предназначены для строк.
Глобальный контекст (Global context) ТипЗнч (TypeOf) Синтаксис: ТипЗнч(<Значение>) Параметры: <Значение> (обязательный) Тип: Произвольный. Значение, тип которого необходимо получить. Возвращаемое значение: Тип: Тип. Описание: Получает тип значения. Доступность: Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер). Пример: Если ТипЗнч(ТекОбъект) = Тип("СправочникСсылка.Номенклатура") Тогда ... КонецЕсли;
Тип (Type) Описание: Значения данного типа используются для идентификации типов значений. Это необходимо для определения и сравнения типов. Данный тип не имеет литералов и возвращается функциями встроенного языка ТипЗнч и Тип. Доступность: Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер). Возможен обмен с сервером. Сериализуется. Данный объект может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту, определяется в пространстве имен {http://v8.1c.ru/8.1/data/core}. Имя типа XDTO: Type
Вопрос. С чего Вы взяли что метод который ТипЗнч должен быть именно такой как Вам он нужен?
Вы там упоминали о том что инструмент не важен для открытия бутылки (с таким подходом Вы б у меня не работали, повзрослеете как специалист - поймете, даже стараться объяснять это не буду). Но у меня почему-то другая ассоциация возникает: Купив велосипед Вы предъявляете производителю претензию к тому что велосипед не летает. И самостоятельно начинаете приваривать крылья к велосипеду, пытаясь доказать всем что именно такими и должны быть велосипеды. Хотя даже с приваренными крыльями он всё-равно летать не станет.
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!