• Как исправить мой код 1С: Предприятие нахождение максимального элемента в табличной части чтоб он не выдавал ошибку?

    Mikhail_E
    @Mikhail_E
    1С, SQL
    Ужас какой.
    Если по вашему коду тогда так :
    Выборка=Справочники.Варианты_головных_уборов.Выбрать(); 
    Пока Выборка.Следующий() Цикл
    	Макс2=0;
    		Для каждого а из Выборка.ТабличнаяЧасть1 Цикл
    			Если Макс2>а.Количество_материалов тогда
    				Макс2=а.Количество_материалов;
    			КонецЕсли;        		
    		КонецЦикла; 
    			Сообщить(макс2.Количество_материалов);
    КонецЦикла;

    А вообще это запросом делается конечно.
    Запрос = Новый Запрос("Выбрать Первые 1 
    		|т.Ссылка как ВариантГоловногоУбора,
    		|Максимум(т.Количество_материалов) как МаксимальноеКоличествоМатериалов
    		|Из Справочник.Варианты_головных_уборов.ТабличнаяЧасть1 как т
    		|Сгруппировать по т.Ссылка
    		|Упорядочить по МаксимальноеКоличествоМатериалов Убыв");
    	РезультатВыборка = Запрос.Выполнить().Выбрать();
    	Если РезультатВыборка.Следующий() Тогда
    		Сообщить("Вариант:"+РезультатВыборка.ВариантГоловногоУбора+", Количество материалов:"+РезультатВыборка.МаксимальноеКоличествоМатериалов); 
    	КонецЕсли;
    Ответ написан
    Комментировать
  • Не понимаю, выполнение кода без итерации?

    Mikhail_E
    @Mikhail_E
    1С, SQL
    foonfyrick ,
    В чём вопрос то ?
    ВыборкаДанных - работает аналогично всем другим ЯП.
    То что при выполнении функции "Следующий()", происходит перещёлкивание на следующию запись и удалось ли перейти на след запись или нет (Истина/Ложь) - Написано в СП ...(RTFM)
    Код вполне адекватный ... "Проверь что-то запросом в таб. части ... если не нашел добавляй по коду ...
    Если нашел - не добавляй. "
    Ответ написан
    Комментировать
  • Что эффективнее работает Join Composite Key или Primary Key?

    Mikhail_E
    @Mikhail_E
    1С, SQL
    Если смотреть по размеру :
    1) Int = 4 байта,
    2) Datetime = 8 байт,
    3) Int + Int = 8 байт,
    4) Int + Int + Int = 12 байт.
    Чтение данных происходит по 8 кб (по умолчанию, т.к. это размер страницы данных по умолчанию.)
    На Одной странице Int поместится в 2 раза больше чем DateTime (Если таблицы имеют одинаковое количество строк и индекс не фрагментирован) поэтому количество страниц данных Datetime в 2 раза больше, следовательно чтений будет в 2 раза больше.

    Т.е. по нагрузке на диск получается
    Рейтинг эффективности :
    1) 1 PK - Int
    2/3) 1 PK - Datetime / Year, Month - int Composite Key
    4) Year, Month, Day - int Composite Key

    Другой вопрос что поиск по одному значению - быстрее чем поиск по 2-м значениям.
    а среди 1 и 2, разница в количестве страниц. Получается 1 лучше чем 2, а 2 лучше чем 3 и 4.
    Чем можно замерить perfomance?

    Через Profiler можно замерить время выполнения, количество чтений с диска и процессорное время.
    События :
    ShowplanXMLStatisticsProfile– графический план выполнения запроса
    RPC:Completed– текст запроса, если он выполняется как процедура
    SQL:BatchCompleted– текст запроса, если он выполняется как обычный запрос
    Поля: Reads, CPU, Duration

    Что лучше будет для Select + Where и для Select + Join

    1 или 2-е, в зависимости от использования (Чтобы избежать лишних преобразований типов при запросах)
    Ответ написан
  • Как настроить доступ к таблице в MS SQL Server?

    Mikhail_E
    @Mikhail_E
    1С, SQL
    Если кратко да - можно, эта тема называется "Ownership Chains"
    (Разделение доступа и наследование разрешений)
    Ответ написан
    1 комментарий
  • Как и где обучиться 1С?

    Mikhail_E
    @Mikhail_E
    1С, SQL
    Без лишних слов, от 1С-ника с 8-летним стажем :
    То есть мне надо понимать предметную область для разработки/изменения конфигурации?
    Быть бухгалтером для работы с бухгалтерией? Быть медиком/провизором, для работы с 1С Медицина?
    Я прав?

    Зависит от подхода к работе, который вы выберете. Есть несколько вариантов.
    Если про "фриланс" или работу в небольшой конторе за 100-120 тыр тогда ответ такой:
    - Отчасти, не прям диплом нужен, но часто придётся общаться с тем же бухгалтером, он будет ставить задачи, и он часто имеет сложности даже с экселем. Т.е. "Чёткое ТЗ" - это , мягко говоря, нечастое явление.
    Т.е. задача например может звучать так "У меня ошибки при расчете себестоимости и не закрывается 20-й счет, посмотри, что нетак ?" ... и причиной вполне может оказаться некорректное разнесение затрат по выпускам.
    Если речь про проектную работу, например Франч и проект по переходу с УПП на ERP (120-160 тыр), в группе обычно будет "Консультант"/"Руководитель проекта" , который сможет принять часть специфичного общения на себя, а тебе выдавать более-менее понятные вещи типа "Надо сделать обработку, которая будет создавать документы на основании экселя" или "Добавь сюда кнопку, чтобы делалось то и то".
    Как и где обучиться 1С?

    Самый простой способ : устроится в 1С Франчайзи, туда берут много и без особых требований, что для старта очень неплохо. З/п при этом обычно 60-80 на начальный этап, + Куча опыта и общения с теми же юзерами. Как говорится "В Омут с головой". А дальше, многое, зависит от вас ... (Например можно пробиться в проектные команды, и перейти от "Палаток с бухучетом" в "Внедрение блоков ERP на предприятиях среднего и крупного бизнеса"
    А за 240K Московских страшно даже думать...

    Далеко не все в Мск получают 240К. Я бы сказал что 240 - это или фрилансер с клиентской базой в 10-20 контор, которые вы поддерживаете, или 1С Эксперт (ака Сеньор) в среднем бизнесе. Обычно мидл имеет 120-160 в мес.

    а так советую посмотреть с чем сталкиваются 1С-ники на Профильных формах и решить стоит оно того или нет.
    Вход в 1С не оч. сложный, востребованность есть (из-за частых изменений законодательства), а про З/П Вилка обычно 60-100 (джун) 100-180 (мидл) 180 - 250 (Эксперт) ...
    Ответ написан
    2 комментария
  • Почему не срабатывают блокировки?

    Mikhail_E
    @Mikhail_E
    1С, SQL
    Думаю дело в "READ_COMMITTED_SNAPSHOT = ON" на тестируемой дб. При включении этого параметра, MSSQL работает в эмуляции версионника а не блокировщика.
    Попробуйте перед тестом выполнить это :
    ALTER DATABASE [ServerTest] SET ALLOW_SNAPSHOT_ISOLATION off; 
    ALTER DATABASE [ServerTest] SET READ_COMMITTED_SNAPSHOT off

    П.С.: Инфо для чтения

    UPD: Если есть необходимость блочить строки с включенным RCSI нужно добавлять хинт "WITH (UPDLOCK)"
    т.е.:
    begin tran
    SELECT TOP (1000) *
      FROM SomeTable With (UPDLOCK) 
    waitfor delay '00:00:15'
    commit tran

    и
    SELECT TOP (1000) *
      FROM SomeTable  WITH (UPDLOCK)
    Ответ написан
  • LEFT JOIN по условию IF?

    Mikhail_E
    @Mikhail_E
    1С, SQL
    .....
    SELECT * 
    FROM artist as a
    LEFT JOIN artist_social_links  as asl
    ON a.id = asl.artist_id  
    and show_links = 1
    where a.id = artist_id;
    .....
    Ответ написан
  • Как указать точный доп. реквизит для загрузки данных?

    Mikhail_E
    @Mikhail_E
    1С, SQL
    Можно попробовать что-то типа:
    РеквизитДляЗаписи = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", ИмяРеквизитаСвойства);


    Или любой другой реквизит, который точно отличается у доп. реквизитов
    Ответ написан
  • Как сформировать SQL запрос?

    Mikhail_E
    @Mikhail_E
    1С, SQL
    Вообще обычно для этого используется функция PIVOT TABLE

    Твой пример

    Результат:
    +=========+=======+==========+============+============+============+============+
    | fam     | name  | otch     | 2021-03-17 | 2021-03-18 | 2021-03-19 | 2021-03-23 |
    +=========+=======+==========+============+============+============+============+
    | Петров  | Иван  | Иванович | 0          | 0          | 3          | 3          |
    +---------+-------+----------+------------+------------+------------+------------+
    | Сидоров | Петр  | Иванович | 4          | 4          | 0          | 4          |
    +---------+-------+----------+------------+------------+------------+------------+
    | Смирнов | Федор | Иванович | 0          | 0          | 0          | 5          |
    +---------+-------+----------+------------+------------+------------+------------+
    Ответ написан
    1 комментарий
  • Как ускорить (оптимизировать) SQL-запрос с временным интервалом?

    Mikhail_E
    @Mikhail_E
    1С, SQL
    1. Нужен индекс по полю "daten"
    2. Избавится от расчета даты в запросе, и передавать в запрос конкретную дату, рассчитанную перед запросом.
    UPD: 2-й пункт особого прироста не даст, из-за расчета справа от сравнения.
    Ответ написан
  • Как сгенерировать строки с датами в sql?

    Mikhail_E
    @Mikhail_E
    1С, SQL
    Да уж ))
    Ну вообще думаю будет как-то так :
    Пример на MSSQL
    Пример на Psql13

    Результат:
    +========+============+=====================+
    | userid | regdate    | newdate             |
    +========+============+=====================+
    | 1      | 2020-11-01 | 2020-11-01 00:00:00 |
    +--------+------------+---------------------+
    | 1      | 2020-11-01 | 2020-12-01 00:00:00 |
    +--------+------------+---------------------+
    | 1      | 2020-11-01 | 2020-12-31 00:00:00 |
    +--------+------------+---------------------+
    | 1      | 2020-11-01 | 2021-01-30 00:00:00 |
    +--------+------------+---------------------+
    | 1      | 2020-11-01 | 2021-03-01 00:00:00 |
    +--------+------------+---------------------+
    | 2      | 2020-12-01 | 2020-12-01 00:00:00 |
    +--------+------------+---------------------+
    | 2      | 2020-12-01 | 2020-12-31 00:00:00 |
    +--------+------------+---------------------+
    | 2      | 2020-12-01 | 2021-01-30 00:00:00 |
    +--------+------------+---------------------+
    | 2      | 2020-12-01 | 2021-03-01 00:00:00 |
    +--------+------------+---------------------+
    Ответ написан
    9 комментариев
  • Как правильно связать таблицы связь многие к многим?

    Mikhail_E
    @Mikhail_E
    1С, SQL
    ну ... типа ... добавить таблицы :
    1. связь Юзерс-Группы,
    2. Связь Группы - Софт
    ...
    Ответ написан
  • Возможно ли Извлечь / Выбрать значение доп. реквизита номенклатуры?

    Mikhail_E
    @Mikhail_E
    1С, SQL
    Если БСП внедрена (Бухгалтерия/УТ/ЕРП/УНФ) тогда так :
    НаименованиеРеквизита = "";	 //Сюда вставить наименование реквизита
    	ЗначениеРеквизита = ""; 		//Сюда вставить значение
    
    	ВашРеквизит = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию(НаименованиеРеквизита );
    
    	ТаблицаДопРеквизитов = Новый ТаблицаЗначений;
    	ТаблицаДопРеквизитов.Колонки.Добавить("Свойство", Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения"));
    	ТаблицаДопРеквизитов.Колонки.Добавить("Значение");
    
    	НоваяСтрокаЗначений = ТаблицаДопРеквизитов.Добавить();
    	НоваяСтрокаЗначений.Свойство = ВашРеквизит;
    	НоваяСтрокаЗначений.Значение= ЗначениеРеквизита ;
    	УправлениеСвойствами.ЗаписатьСвойстваУОбъекта( НоваяНоменклатураСсылка, ТаблицаДопРеквизитов)
    Ответ написан
  • Можно ли прочитать данные, если есть ошибки, и залить их в другую БД?

    Mikhail_E
    @Mikhail_E
    1С, SQL
    !Рекомендую сначала сделать физическую копию файлов БД (mdf,ldf)!
    Как вариант определить битые таблицы по ID, и попробовать Checktable на конкретных таблицах сначала Repair_rebuild, если СУБД ответит что минимальный уровень - REPAIR_ALLOW_DATA_LOSS , значит сделать Checktable(<ПутьКТаблице>,REPAIR_ALLOW_DATA_LOSS ). Покоцанные страницы таблиц будут очищены, но те, что не покоцаны, должны стать доступны для работы (часть данных потеряется, но БД должна стать доступна для работы).
    Если определить битые таблицы по ID - проблематично (по каким-то причинам) можно сразу на БД зарядить :
    DBCC CheckDB (<ИМЯБД>, REPAIR_ALLOW_DATA_LOSS).
    Т.е. скрипт примерно такой:
    USE ИмяБД;
    GO  
    --(Далее выполнять поочереди)
    EXEC sp_resetstatus 'ИмяБД'
    GO
    
    ALTER DATABASE 'ИмяБД' SET SINGLE_USER WITH ROLLBACK IMMEDIATE
    GO
    
    --Попробовать:
    DBCC CHECKALLOC (ИмяБД, REPAIR_REBUILD) WITH NO_INFOMSGS
    GO
    
    --Если СУБД сообщит, что для исправления ошибок - минимальный уровень 
    --REPAIR_ALLOW_DATA_LOSS тогда:
    DBCC CheckDB (ИмяБД, REPAIR_ALLOW_DATA_LOSS) WITH NO_INFOMSGS
    GO
    
    ALTER DATABASE ИмяБД SET MULTI_USER
    GO
    Ответ написан
  • Отобразить видимость регистра накоплений?

    Mikhail_E
    @Mikhail_E
    1С, SQL
    скорее всего первый документ не является регистратором регистра
    Ответ написан
    5 комментариев
  • Как заставить сервер c 2xE5-2630 v4, 128GB, raid ssd грузить процессор на 100% (тест Гилева 21,65)?

    Mikhail_E
    @Mikhail_E
    1С, SQL
    1. Загрузить процессор на MSSQL можно так :
    - Должна быть задача на SQL серваке, которая потребует этих ресурсов (в простое или при малых задачах SQL проц не загрузит)
    - Ставим параллелизм = количеству ядер
    - Ставим Стоимостной порог в 0.
    После завершения текущих проверок, советую вернуть MAXDOP/MaxThreshhold на (1/4 или 1/8 от количества ядер а порог выявить методом проб и замеров). Дело в том, что загрузка проца 100% не значит что всё будет быстрее (только в некоторых случаях типа проверки целостности). Т.к. при распараллеливании запросов по ядрам, появляются "Накладные расходы" на распараллеливание и сбор обратно результатов воедино. Это будет выглядеть как ожидания CXPACKET и Latch. (См "закон Амадала" + CXPACKET в гугле)
    2. "Проверка целостности базы данных" - на ежедневной основе смысла не имеет, особенно если база достаточно крупная. Её имеет смысл делать или при возникновении проблем, или раз в квартал/месяц ... зависит от размеров базы. UPD: Лучше всё же её делать, если позволяет размер и тех. окно. Т.к. можно упустить ошибку целостности и перенести её в бэкап.
    3. Если есть проблемы с производительностью, это вопрос не простой, и требует кучу опыта. Навскидку рекомендую сначала проверить :
    - Нагрузку на дисковую подсистему, и если там будет проблема (Очередь к диску более 2 в среднем) выполнить разнесение *.mdf, *.log, tempdb, инстанс кластера 1c серверов на отдельные диски.
    - Нагрузку на оперативку от MSSQL (можете гуглить это может вызывать большую активность IO на дисковую подсистему)
    - Проверить способ коннекта к MSSQL ("Shared memory" должно быть "on" и использоваться, если 1с сервак и mssql сервак физически на одно машине .. это +10% к производительности.
    ну и куча чего ещё ... в одном посте всего не расписать.
    и т.д. вариантов очень много.
    главный совет: решайте проблемы , только если она есть и мешает, если это лично ваше мнение, а пользователям не мешает, лучше делайте настройки по дефолту (см. APDEX, анализ производительности)
    UPD: И да, виртуалки для 1C + MSSQL = зло, и не потому что "фирма 1С плохая", а потому что у вас не сможет 1С и MSSQL не сможет общаться через оперативку, и между оператором чтения на MSSQL до железа сервера будет 4 прослойки (SQLOS, OS виртуалки, Гипервизор, OS сервера, вместо SQLOS + OS сервера).
    Ответ написан
  • Как разработать программу, приводящую данные к отчетному виду?

    Mikhail_E
    @Mikhail_E
    1С, SQL
    Это тема для дипломной работы ?
    По делу, начните с декомпозиции задачи.
    обдумайте :
    - Ввод первичных данных,
    - агрегация и хранение данных,
    - обработка данных (расчеты и вычисления),
    - Формирование и хранение схем-макетов "отчетного вида",
    - Получение схем-макетов с заполнением данными из бд и вывод на принтер
    ... делов то... )
    Ответ написан
    3 комментария
  • Нерабочий кулер на ноутбуке?

    Mikhail_E
    @Mikhail_E
    1С, SQL
    1. Если вы счастливый обладатель ноута DELL, "Работу/неисправность" куллера, можно посмотреть в биосе, там есть Log событий устройств. "Неисправность" - будет выглядеть как запись "Fan malfunction" с датой события.
    2. Если ещё не сделали, вырубите в биосе "C-State" - из-за него часто происходят "непонятки" с СО на ноутах DELL

    P.S. сам обладатель ноута G7 7790, СО просто отвратная. Без андервольтинга проца, из троттлинга не выходил в играх.
    Ответ написан
  • Near "отпуска": syntax error?

    Mikhail_E
    @Mikhail_E
    1С, SQL
    На MSSQL проблема была что В Имени колонки не должно быть пробелов.
    CREATE TABLE Отпуск
    (Кодотпуска INTEGER PRIMARY KEY,
    ТипОтпуска CHAR (100) NOT NULL,
    ОплатаОтпуска FLOAT CHECK (ОплатаОтпуска > 10000),
    ЛьготыПоОтпуску FLOAT NOT NULL);

    так сработало ...
    и задумайтесь над использованием типов NVARCHAR и Money/Decimal/numeric ... всё таки цифры про деньги должны быть точными.
    Ответ написан
  • Как найти подмену в кириллице на латинские?

    Mikhail_E
    @Mikhail_E
    1С, SQL
    Можно воспользоваться regexp'ом
    <?php
    $str = "Привeт, как делa?";
    $pattern = "/[a-zA-Z]+/i";
    echo preg_match($pattern, $str); // Outputs 1


    Проверка PHP code
    Ответ написан
    4 комментария