Задание 3 ЕГЭ по информатике 2027: поиск в базе данных
- Раздел
- Информационные технологии
- Максимальный балл
- 1 балл
- Уровень
- базовый
- Что проверяет
- Умение поиска информации в реляционных базах данных
- Что нужно сделать
- В файле электронной таблицы — база данных из нескольких связанных таблиц. Отобрать записи по условию и посчитать сумму или количество.
- Как записать ответ
- только число: целое, без пробелов и единиц измерения
- Время
- Около 3 минут по обобщённому плану ФИПИ
- Элемент кодификатора
- 4.5
- Компьютер
- Нужна программа или электронная таблица: на станции КЕГЭ — среды программирования на C#, C++, Pascal, Java, Python и редактор таблиц
- Файл к заданию
- электронная таблица .ods; на сайте рядом — копия .xlsx, и CSV для Python
- В 2026 году
- Тоже задание 3
Задание 3 ЕГЭ по информатике 2027 года проверяет, по формулировке обобщённого плана ФИПИ, «Умение поиска информации в реляционных базах данных». В КИМ 2026 года под этим номером было то же задание: «Изменения структуры КИМ отсутствуют», среди новых тем 2027 года задание 3 не названо.
К заданию приложен файл — база данных из трёх связанных таблиц: движение товаров (дата, ID магазина, артикул, количество упаковок, тип операции) и два справочника — товаров и магазинов. Связи заданы ключами: по ID магазина строка ссылается на магазин, по артикулу — на товар. Нужно отобрать записи по нескольким условиям сразу и посчитать итог: массу в килограммах, выручку в рублях или изменение остатка в упаковках.
Уровень базовый, по обобщённому плану — около 3 минут, за верный ответ 1 балл. Это одно из заданий, где нужен компьютер. В 2026 году с заданием справились 67,8 % участников, в 2025 году — 75,6 %. Методические рекомендации по итогам 2026 года советуют «уделить особое внимание» «организации вычислений в электронных таблицах».
Ниже — три типа задания с разбором, решением на Python и формулами. Разбор демоверсии 2027 года и типичные ошибки — в конце, тренажёр — сразу под этим текстом.
Тренажёр задания 3
Десять заданий номера 3 из банка тренажёра — с файлами, как на станции КЕГЭ. Решайте в песочнице Python прямо на странице или у себя; ответ проверяется по ключу, после проверки — верный ответ, разбор и решение на Python, а при ошибке — разбор от ИИ. Кнопка «Ещё 5 таких» у типа задания ниже даёт задания одного типа.
Задание 3 вместе с остальными — в вариантах целиком.
Типы задания 3 с решением
Масса или количество товара за период в магазинах на улице
Условие этого типа: сколько килограммов (или упаковок) товара одного вида получили магазины с заданным адресом за период. Своими словами: сколько килограммов пряников получили магазины на Заречной улице с 7 по 13 октября 2025 года включительно?
Лист «Движение товаров» (3_moves.csv):
ID операции,Дата,ID магазина,Артикул,"Количество упаковок, шт.",Тип операции 1,08.10.2025,M1,401,2,Поступление 2,10.10.2025,M2,402,3,Поступление 3,06.10.2025,M2,402,4,Поступление 4,12.10.2025,M3,401,5,Продажа 5,14.10.2025,M2,403,1,Поступление
Лист «Товар» (3_goods.csv):
Артикул,Отдел,Наименование товара,Ед_изм,Количество в упаковке,Цена за упаковку 401,Кондитерские изделия,Пряники медовые,грамм,2000,150 402,Кондитерские изделия,Пряники тульские,грамм,3000,180 403,Кондитерские изделия,Печенье овсяное,грамм,1000,90
Лист «Магазин» (3_shops.csv):
ID магазина,Район,Адрес M1,Заречный,"ул. Заречная, д. 5" M2,Заречный,"ул. Заречная, д. 12" M3,Центральный,"ул. Центральная, д. 7"
Для этого примера ответ — 13.
Задание выполняется с использованием прилагаемого файла
1. Прочитайте три листа. 2. Соберите словарь «артикул → масса упаковки в граммах», оставив только пряники, и список ID магазинов, в адресе которых есть «Заречная». 3. Оставьте строки «Поступление» с нужным магазином, артикулом и датой внутри периода. 4. Для каждой такой строки прибавьте «количество упаковок × масса упаковки». 5. Разделите итог на 1000 нацело.
На примере: подходят строки 1 (2 × 2000 = 4000 г) и 2 (3 × 3000 = 9000 г); строка 3 раньше периода, строка 4 — продажа, строка 5 — не пряники. Ответ 13.
import csv
from datetime import date
def read(name):
# CSV-копия листа: первая строка — заголовки столбцов
with open(name, encoding='utf-8') as f:
return list(csv.DictReader(f))
def day(text):
# «08.10.2025» -> дата; сравнивать даты как строки нельзя
d, m, y = (int(x) for x in text.split('.'))
return date(y, m, d)
goods = read('3_goods.csv')
shops = read('3_shops.csv')
moves = read('3_moves.csv')
# артикул -> масса одной упаковки в граммах: нужны только пряники
gramm = {g['Артикул']: int(g['Количество в упаковке'])
for g in goods if g['Наименование товара'].startswith('Пряники')}
# ID магазинов на Заречной улице
street = {s['ID магазина'] for s in shops if 'Заречная' in s['Адрес']}
total = 0 # масса в граммах
for row in moves:
if row['Тип операции'] != 'Поступление':
continue # проданный товар в массу поступления не входит
if row['ID магазина'] not in street or row['Артикул'] not in gramm:
continue
if date(2025, 10, 7) <= day(row['Дата']) <= date(2025, 10, 13):
total += int(row['Количество упаковок, шт.']) * gramm[row['Артикул']]
print(total // 1000) # граммы -> килограммы
Ответ на приложенном файле: 67
В свободных столбцах G, H, I — наименование товара, масса упаковки и адрес магазина:
=ВПР(D2;$Товар.$A$2:$F$1000;3;0) =ВПР(D2;$Товар.$A$2:$F$1000;5;0) =ВПР(C2;$Магазин.$A$2:$C$1000;3;0)
В J2 — масса подошедшего поступления, иначе 0:
=ЕСЛИ(И(F2="Поступление";ЛЕВСИМВ(G2;ДЛСТР("Пряники"))="Пряники";ЕЧИСЛО(ПОИСК("Заречная";I2));B2>=ДАТА(2025;10;7);B2<=ДАТА(2025;10;13));E2*H2;0)Протяните G2:J2 вниз: =СУММ(J:J)/1000 даёт 13. В Excel ссылка на лист пишется Товар!$A$2:$F$1000.
Выручка магазинов района за период
Условие этого типа: на какую сумму (в руб.) продан товар одного вида в магазинах заданного района за период. Своими словами: на какую сумму продали конфет в магазинах Заречного района с 6 по 14 марта 2024 года включительно?
Лист «Движение товаров» (3_moves.csv):
ID операции,Дата,ID магазина,Артикул,"Количество упаковок, шт.",Тип операции 1,07.03.2024,M1,101,2,Продажа 2,07.03.2024,M2,102,3,Продажа 3,05.03.2024,M1,101,4,Продажа 4,10.03.2024,M3,101,5,Продажа 5,12.03.2024,M1,103,6,Продажа
Лист «Товар» (3_goods.csv):
Артикул,Отдел,Наименование товара,Ед_изм,Количество в упаковке,Цена за упаковку 101,Кондитерские изделия,Конфеты шоколадные,грамм,250,132 102,Кондитерские изделия,Конфеты карамель,шт,1,299 103,Кондитерские изделия,Печенье овсяное,грамм,1000,90
Лист «Магазин» (3_shops.csv):
ID магазина,Район,Адрес M1,Заречный,"ул. Заречная, д. 5" M2,Заречный,"ул. Заречная, д. 12" M3,Центральный,"ул. Центральная, д. 7"
Для этого примера ответ — 1161.
Задание выполняется с использованием прилагаемого файла
1. Прочитайте листы движения, товаров и магазинов. 2. Соберите словарь «артикул → цена за упаковку» только по конфетам и список ID магазинов нужного района. 3. Оставьте строки «Продажа» с магазином из списка, артикулом из словаря и датой внутри периода. 4. Для каждой строки прибавьте «количество упаковок × цена за упаковку»; делить не на что — цена дана за упаковку.
На примере: подходят строки 1 (2 × 132 = 264 руб.) и 2 (3 × 299 = 897 руб.); строка 3 раньше периода, строка 4 — не Заречный район, строка 5 — печенье. Ответ 1161 руб.
import csv
from datetime import date
def read(name):
with open(name, encoding='utf-8') as f:
return list(csv.DictReader(f))
def day(text):
d, m, y = (int(x) for x in text.split('.'))
return date(y, m, d)
goods = read('3_goods.csv')
shops = read('3_shops.csv')
moves = read('3_moves.csv')
# артикул -> цена за упаковку: берём только конфеты
price = {g['Артикул']: int(g['Цена за упаковку'])
for g in goods if g['Наименование товара'].startswith('Конфеты')}
# ID магазинов Заречного района
district = {s['ID магазина'] for s in shops if s['Район'] == 'Заречный'}
total = 0 # выручка в рублях
for row in moves:
if row['Тип операции'] != 'Продажа':
continue # выручка — это только проданный товар
if row['ID магазина'] not in district or row['Артикул'] not in price:
continue
if date(2024, 3, 6) <= day(row['Дата']) <= date(2024, 3, 14):
total += int(row['Количество упаковок, шт.']) * price[row['Артикул']]
print(total)
Ответ на приложенном файле: 21740
В свободных столбцах G, H, I — наименование товара, цена упаковки и район магазина:
=ВПР(D2;$Товар.$A$2:$F$1000;3;0) =ВПР(D2;$Товар.$A$2:$F$1000;6;0) =ВПР(C2;$Магазин.$A$2:$C$1000;2;0)
В J2 — выручка по строке, если она подошла, иначе 0:
=ЕСЛИ(И(F2="Продажа";ЛЕВСИМВ(G2;ДЛСТР("Конфеты"))="Конфеты";I2="Заречный";B2>=ДАТА(2024;3;6);B2<=ДАТА(2024;3;14));E2*H2;0)Протяните G2:J2 вниз: =СУММ(J:J) даёт 1161 руб. Район сравнивается целиком, а улица в первом типе — как часть адреса.
Изменение остатка товара в магазине за период
Условие этого типа: как изменился остаток одного товара в одном магазине за период; поступления увеличивают остаток, продажи уменьшают. Своими словами: как изменился остаток товара «Зефир сливочный» в магазине M8 с 6 по 12 сентября 2025 года включительно?
Лист «Движение товаров» (3_moves.csv):
ID операции,Дата,ID магазина,Артикул,"Количество упаковок, шт.",Тип операции 1,07.09.2025,M8,201,5,Поступление 2,09.09.2025,M8,201,3,Продажа 3,05.09.2025,M8,201,4,Поступление 4,10.09.2025,M1,201,7,Продажа 5,11.09.2025,M8,202,2,Поступление
Лист «Товар» (3_goods.csv):
Артикул,Отдел,Наименование товара,Ед_изм,Количество в упаковке,Цена за упаковку 201,Кондитерские изделия,Зефир сливочный,грамм,3000,330 202,Кондитерские изделия,Зефир ванильный,грамм,3000,160
Лист «Магазин» (3_shops.csv):
ID магазина,Район,Адрес M1,Заречный,"ул. Заречная, д. 5" M8,Луговой,"ул. Луговая, д. 8" M15,Центральный,"ул. Центральная, д. 3"
Для этого примера ответ — 2.
Задание выполняется с использованием прилагаемого файла
1. Прочитайте лист движения и справочник товаров: адрес и район здесь не нужны, магазин назван в условии. 2. Найдите артикул по точному наименованию «Зефир сливочный». 3. Оставьте строки нужного магазина и артикула с датами внутри периода. 4. Поступление прибавляет количество упаковок, продажа вычитает; ответ может быть отрицательным.
На примере: подходят строка 1 (+5) и строка 2 (−3); строка 3 раньше периода, строка 4 — другой магазин, строка 5 — другой товар. Ответ 2.
import csv
from datetime import date
def read(name):
with open(name, encoding='utf-8') as f:
return list(csv.DictReader(f))
def day(text):
d, m, y = (int(x) for x in text.split('.'))
return date(y, m, d)
goods = read('3_goods.csv')
moves = read('3_moves.csv')
# артикул нужного товара: наименование берём из условия дословно
article = next(g['Артикул'] for g in goods if g['Наименование товара'] == 'Зефир сливочный')
change = 0 # изменение остатка в упаковках
for row in moves:
if row['ID магазина'] != 'M8' or row['Артикул'] != article:
continue
if not date(2025, 9, 6) <= day(row['Дата']) <= date(2025, 9, 12):
continue
if row['Тип операции'] == 'Поступление':
change += int(row['Количество упаковок, шт.'])
else:
change -= int(row['Количество упаковок, шт.']) # продажа уменьшает остаток
print(change)
Ответ на приложенном файле: 14
Артикул в столбце D записан числом, поэтому в условии он без кавычек: 201. Если артикул неизвестен, его находят по наименованию: =ВПР("Зефир сливочный";$Товар.$A$2:$F$1000;1;0). В J2 — вклад строки в изменение остатка:
=ЕСЛИ(И(C2="M8";D2=201;B2>=ДАТА(2025;9;6);B2<=ДАТА(2025;9;12));ЕСЛИ(F2="Поступление";E2;-E2);0)
Внутренняя ЕСЛИ ставит знак: поступление прибавляет упаковки, продажа вычитает. Протяните J2 вниз: =СУММ(J:J) даёт 2.
Как выполнять задание
- Откройте файл и посмотрите имена листов: в демоверсии 2027 года это «Движение_товаров», «Товар» и «Магазин»; в каждом варианте имена свои.
- Разберитесь в связях: строка движения ссылается на магазин через ID магазина и на товар через артикул, других связей нет.
- Выпишите из условия все ограничения — тип операции, диапазон дат, вид товара, улица или район; выполняться они должны одновременно.
- Выберите инструмент: в электронной таблице подтяните поля справочников функцией ВПР, посчитайте вклад каждой строки в отдельном столбце и сложите; если удобнее программировать, сохраните лист в CSV и читайте из Python.
- Запишите ответ — только целое число, без пробелов и единиц измерения.
Что нужно знать
- Реляционная база данных. Данные разложены по таблицам, связи заданы ключами: ID магазина и артикул в таблице движения ссылаются на справочники. Названий улиц, районов и товаров в главной таблице нет.
- Поиск по ключу — ВПР. =ВПР(ключ; диапазон справочника; номер столбца; 0): 0 — точное совпадение, диапазон фиксируют знаками $. Иначе формула подставляет чужую строку.
- Итог — СУММ. Вклад строки считают в отдельном столбце, потом складывают: =СУММ(J:J). Так видно, сколько строк отобралось.
- Единицы. Для товаров с единицей «грамм» в поле «Количество в упаковке» дана масса упаковки, ответ в килограммах получают делением суммы на 1000.
- Даты. Границы периода сравнивают через ДАТА(2025;6;5), а не как текст.
Демоверсию 2027 года с этим файлом можно открыть на странице вариантов КЕГЭ.
Как оценивается
Проверка автоматическая, по ключу: ответ должен быть записан в форме из условия и полностью совпасть с эталоном. Код и черновики не проверяют — значение имеет только ответ. За верный ответ — 1 балл, частичного балла нет.
Критерии всех заданий экзамена — на странице критериев ЕГЭ.
Разбор задания демоверсии 2027
В демоверсии 2027 года приложен файл demo_3.ods — база «Кондитерские изделия». Спрашивают общую массу (в кг) всех видов зефира, полученного магазинами на Прибрежной улице, с 5 по 19 июня включительно.
В условии четыре ограничения сразу: тип операции «Поступление», дата внутри периода, адрес магазина содержит «Прибрежную», наименование начинается со слова «Зефир». Для подошедшей строки нужны два поля из справочников: по артикулу — масса упаковки, по ID магазина — адрес. Единица измерения «грамм» означает, что в поле «Количество в упаковке» стоит масса упаковки: у артикула 5 («Зефир ванильный») это 800 г. Масса поступления — «количество упаковок × масса упаковки»; сумму в граммах делят на 1000.
Строк несколько тысяч, вручную их не перебрать. Тот же алгоритм, что в первом типе ниже, применённый к файлам демоверсии, даёт 1630 — это ключ ФИПИ.
Типичные ошибки
Складывают и поступления, и продажи
Для массы берут строки «Поступление», для выручки — «Продажа», для изменения остатка — те и другие со своим знаком. Сумма по всем строкам подряд ответ искажает.
ВПР без последнего аргумента
=ВПР(D2;$Товар.$A$2:$F$1000;3) ищет не точное совпадение и подставляет данные соседнего артикула. Пишите 0: иначе ошибка не видна, а ответ неверный.
Диапазон справочника не зафиксирован
Без знаков $ диапазон при протягивании съезжает вниз, и последние строки ищут товар в пустоте. Нужно $Товар.$A$2:$F$1000.
Дата сравнивается как текст
Как текст «10.06.2025» больше, чем «09.07.2025»: первый символ «1» больше «0», — хотя 10 июня раньше 9 июля. Границы периода задают через ДАТА(2025;6;5); в Python дату разбирают, а не сравнивают строки.
Граммы и килограммы
Масса строки — «количество упаковок × масса упаковки в граммах», а делят на 1000 один раз, уже готовую сумму.
Вопросы и ответы
Что изменилось в задании 3 в 2027 году?
Ничего: тема и номер сохранились. В документе ФИПИ об изменениях сказано «Изменения структуры КИМ отсутствуют», перечислены только новые темы заданий 10, 13 и 23.
Как решать: через ВПР или через СУММЕСЛИМН?
ВПР нужна в любом случае: она подтягивает поля справочников по ключу — наименование, массу или цену, адрес или район. Итог по строкам, прошедшим все условия, считает СУММ или СУММЕСЛИМН с парами «диапазон; условие».
Сколько баллов и времени отведено на задание 3?
1 балл, частичного балла нет. По обобщённому плану ФИПИ — около 3 минут, уровень базовый. Это задание с использованием специализированного программного обеспечения: файл открывают в редакторе электронных таблиц или обрабатывают программой.
Можно ли решить задание 3 программой на Python?
Да. Файл задания — электронная таблица (.ods), поэтому лист сохраняют в CSV и читают обычным open(name). Код на этой странице работает с CSV-копиями листов, модули csv и datetime входят в стандартную библиотеку.
Другие задания раздела «Информационные технологии»
- Задание 9электронная таблица: строки с условиями · до 1 балла
- Задание 18Робот на поле с монетами · до 1 балла
- Задание 27кластеризация данных · до 2 баллов
По демоверсии, спецификации и кодификатору ФИПИ 2027
Обновлено: